2016-05-16 49 views
10

我想從時間戳字段中獲取日期部分。 我用這個SQL查詢:爲什麼CAST()函數返回錯誤的日期?

select timestamp, CAST(timestamp as date) as date from messages 

我得到了以下結果:

-------------------------------------------- 
|  timestamp  |  date  | 
-------------------------------------------- 
| 2016-05-15 10:22:54 | 2016-05-16 | 
-------------------------------------------- 

如上所示,日期字段產生返回錯誤的日期2016-05-16而原始日期是2016-05-15

我們該如何解決這個問題?

回答

5

使用日期不投,因爲不投,但格式

select timestamp, date(timestamp) as my_date from messages 
+0

偉大的答案。感謝它像魅力一樣工作。 但DATE_FORMAT()函數也會產生錯誤的格式。這是爲什麼? – user2899728

+2

Date()提取有效日期時間的日期部分,,, Date_format更改日期的方面......你使用什麼格式..? – scaisEdge

+0

我使用了'%d%M,%Y' – user2899728

0

試試這個

select timestamp, cast(timestamp as date format 'yyyymmddhhmmss') as date from messages 
+0

得到SQL錯誤:#1064 - 您的SQL語法中有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'format'yyyymmddhhmmss''附近使用正確的語法),作爲來自第1行消息LIMIT 0,25'的日期 – user2899728

5

我會建議你使用DATE_FORMAT函數,而不是CAST因爲要格式化的日期像

SELECT `timestamp`, DATE_FORMAT(`timestamp`, '%Y-%m-%d) as my_date from messages 

還要注意CAST和DATE函數都在內部調用Item _date_typecast函數,所以它們之間沒有這樣的區別。

7

這不是一個問題!它只能設置錯誤的time_zone。看樣

獲取當前的time_zone

SHOW GLOBAL VARIABLES LIKE 'time_zone'; -- systemwide setting 
SHOW VARIABLES LIKE 'time_zone'; -- session setting 

樣品

MariaDB [mysql]> select t, CAST(t as date) FROM groupme LIMIT 1; 
+---------------------+-----------------+ 
| t     | CAST(t as date) | 
+---------------------+-----------------+ 
| 2016-05-15 20:22:54 | 2016-05-15  | 
+---------------------+-----------------+ 
1 row in set (0.00 sec) 

MariaDB [mysql]> SET time_zone ='-12:00'; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [mysql]> select t, CAST(t as date) FROM groupme LIMIT 1; 
+---------------------+-----------------+ 
| t     | CAST(t as date) | 
+---------------------+-----------------+ 
| 2016-05-14 20:22:54 | 2016-05-14  | 
+---------------------+-----------------+ 
1 row in set (0.00 sec) 

MariaDB [mysql]> 
相關問題