为什么CAST()函数返回错误的日期?
问题描述:
我想从时间戳字段中获取日期部分。 我用这个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
。
我们该如何解决这个问题?
答
使用日期不投,因为不投,但格式
select timestamp, date(timestamp) as my_date from messages
答
试试这个
select timestamp, cast(timestamp as date format 'yyyymmddhhmmss') as date from messages
+0
得到SQL错误:#1064 - 您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在'format'yyyymmddhhmmss''附近使用正确的语法),作为来自第1行消息LIMIT 0,25'的日期 – user2899728
答
我会建议你使用DATE_FORMAT函数,而不是CAST因为要格式化的日期像
SELECT `timestamp`, DATE_FORMAT(`timestamp`, '%Y-%m-%d) as my_date from messages
还要注意CAST和DATE函数都在内部调用Item _date_typecast函数,所以它们之间没有这样的区别。
答
这不是一个问题!它只能设置错误的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]>
伟大的答案。感谢它像魅力一样工作。 但DATE_FORMAT()函数也会产生错误的格式。这是为什么? – user2899728
Date()提取有效日期时间的日期部分,,, Date_format更改日期的方面......你使用什么格式..? – scaisEdge
我使用了'%d%M,%Y' – user2899728