2016-05-16 78 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]> 
相关问题