MySQL将时间转换为HH:MM

MySQL将时间转换为HH:MM

问题描述:

为什么SELECT STR_TO_DATE('07:30 PM','%H:%I %p');返回NULLMySQL将时间转换为HH:MM

我希望看到19:30

更多的上下文:

我想,来查询的时间列的值存储为HH:MM PM表。例如:

SELECT * FROM table where (STR_TO_DATE(table.time, '%H:%I %p') < NOW())

+1

它可能是一个错字,因为它只是似乎不可思议,但官方文档状态'%I'是小时和'%i'是分钟。 (另外,它看起来像你可以使用'%r'作为整个字符串。)[DATE_FORMAT](https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions。 html#function_date-format) – Uueerdo

+0

@Uueerdo'%H'用于军事时间,00-23,'%h'或'%I'用于标准时间00-12,AM/PM用'%p' 。 –

+0

@JoeStefanelli是的,'%H'也可能导致它们的问题;我不明白'23:00 AM'可以如何优雅地处理。 – Uueerdo

你已经损坏了一些格式代码。它应该是'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()) 

以供将来参考,这里的格式代码从MySQL文档的表格: enter image description here

查看原始文档的位置:
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html