2016-08-07 34 views
1

我發現MySQL的函數STR_TO_DATE()有些奇怪。它似乎無法解析倍,像這樣:如果僅用時間組件調用MySQL的STR_TO_DATE(),則返回NULL

它可以在一個完整的字符串:

mysql> SELECT STR_TO_DATE('08/07/16 11:59 AM', '%m/%d/%y %l:%i %p'); 
+-------------------------------------------------------+ 
| STR_TO_DATE('08/07/16 11:59 AM', '%m/%d/%y %l:%i %p') | 
+-------------------------------------------------------+ 
| 2016-08-07 11:59:00         | 
+-------------------------------------------------------+ 
1 row in set (0.00 sec) 

日期僅適用於:

mysql> SELECT STR_TO_DATE('08/07/16', '%m/%d/%y'); 
+-------------------------------------+ 
| STR_TO_DATE('08/07/16', '%m/%d/%y') | 
+-------------------------------------+ 
| 2016-08-07       | 
+-------------------------------------+ 
1 row in set (0.00 sec) 

時間只有不到:

mysql> SELECT STR_TO_DATE('11:59 AM', '%l:%i %p'); 
+-------------------------------------+ 
| STR_TO_DATE('11:59 AM', '%l:%i %p') | 
+-------------------------------------+ 
| NULL        | 
+-------------------------------------+ 
1 row in set, 1 warning (0.00 sec) 

格式化工作時間:

mysql> SELECT DATE_FORMAT(NOW(), '%l:%i %p'); 
+--------------------------------+ 
| DATE_FORMAT(NOW(), '%l:%i %p') | 
+--------------------------------+ 
| 1:58 PM      | 
+--------------------------------+ 
1 row in set (0.00 sec) 

但格式化時間,然後使用相同的格式字符串將其切回。

mysql> SELECT STR_TO_DATE(DATE_FORMAT(NOW(), '%l:%i %p'), '%l:%i %p'); 
+---------------------------------------------------------+ 
| STR_TO_DATE(DATE_FORMAT(NOW(), '%l:%i %p'), '%l:%i %p') | 
+---------------------------------------------------------+ 
| NULL             | 
+---------------------------------------------------------+ 
1 row in set, 1 warning (0.00 sec) 

作爲一種變通方法,我結束了做:

mysql> SELECT TIME(STR_TO_DATE('08/07/16 11:59 AM', '%m/%d/%y %l:%i %p')); 
+-------------------------------------------------------------+ 
| TIME(STR_TO_DATE('08/07/16 11:59 AM', '%m/%d/%y %l:%i %p')) | 
+-------------------------------------------------------------+ 
| 11:59:00             | 
+-------------------------------------------------------------+ 
1 row in set (0.00 sec) 

的數據存儲在一個巨大的CSV文件的方式,所以編輯這將是一個痛苦。我只是想知道這是否正常,或者我忽視了簡單的事情。如果它的事項

服務器信息:

mysql> status 
-------------- 
mysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper 

Connection id:   19 
Current database: 
Current user:   [email protected] 
SSL:     Cipher in use is DHE-RSA-AES256-SHA 
Current pager:   stdout 
Using outfile:   '' 
Using delimiter:  ; 
Server version:   5.7.13-log MySQL Community Server (GPL) 
Protocol version:  10 
Connection:    Localhost via UNIX socket 
Server characterset: latin1 
Db  characterset: latin1 
Client characterset: utf8 
Conn. characterset: utf8 
UNIX socket:   /var/run/mysqld/mysqld.sock 
Uptime:     29 min 10 sec 

回答

3

請記住,有一種特殊的NO_ZERO_DATENO_ZERO_IN_DATE SQL模式可能禁止零周的日期,從而讓STR_TO_DATE()回報NULL如果只分析一個時間。

嘗試只用一次運行STR_TO_DATE()之前運行以下命令:

mysql> SET sql_mode = ''; 
+0

這是問題。我甚至沒有想過用那個函數來檢查那個行爲。爲了避免使用模式,我使用'SET sql_mode =(SELECT REPLACE(@@ sql_mode,'NO_ZERO_DATE',''));' – emaNoN

+0

您可能還需要 SET sql_mode =(SELECT REPLACE(@@ sql_mode,' NO_ZERO_IN_DATE',''));' –