2017-05-31 73 views
0

爲什麼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

回答

1

你已經損壞了一些格式代碼。它應該是'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) 
1

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

相關問題