MySQL将时间转换为HH:MM
问题描述:
为什么SELECT STR_TO_DATE('07:30 PM','%H:%I %p');
返回NULL
?MySQL将时间转换为HH:MM
我希望看到19:30
更多的上下文:
我想,来查询的时间列的值存储为HH:MM PM
表。例如:
SELECT * FROM table where (STR_TO_DATE(table.time, '%H:%I %p') < NOW())
答
你已经损坏了一些格式代码。它应该是'07:30 PM','%h:%i %p'
。 此外,你需要一个SQL模式,可以让因为this无效日期:
未指定的日期或时间部分有一个0值,因此在STR未完全指定的值会产生一些结果或所有部分设置为0
mysql> SET @@SESSION.sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> STR_TO_DATE('07:30 PM','%H:%I %p') as original,
-> STR_TO_DATE('07:30 PM','%h:%i %p') as fixed;
+----------+-------+
| original | fixed |
+----------+-------+
| NULL | NULL |
+----------+-------+
1 row in set, 3 warnings (0.00 sec)
mysql> SET @@SESSION.sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> STR_TO_DATE('07:30 PM','%H:%I %p') as original,
-> STR_TO_DATE('07:30 PM','%h:%i %p') as fixed;
+----------+----------+
| original | fixed |
+----------+----------+
| NULL | 19:30:00 |
+----------+----------+
1 row in set, 1 warning (0.00 sec)
答
NOW()
返回datetime,像2014-11-22 12:45:34
。你可能想要比较时间,而不是日期,因为你没有比较实际的一天,只是时间。改用CURTIME()
来代替。此外,%I
是小时,你想%i
几分钟。 %H
为12小时格式,您需要%h
为24小时格式。所以,你的说法应该是更象:
SELECT * FROM table where (STR_TO_DATE(table.time, '%h:%i %p') < CURTIME())
查看原始文档的位置:
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
它可能是一个错字,因为它只是似乎不可思议,但官方文档状态'%I'是小时和'%i'是分钟。 (另外,它看起来像你可以使用'%r'作为整个字符串。)[DATE_FORMAT](https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions。 html#function_date-format) – Uueerdo
@Uueerdo'%H'用于军事时间,00-23,'%h'或'%I'用于标准时间00-12,AM/PM用'%p' 。 –
@JoeStefanelli是的,'%H'也可能导致它们的问题;我不明白'23:00 AM'可以如何优雅地处理。 – Uueerdo