3

我有以下表结构:

uid     | ... | created | ...
int(10) | ... | int(10) | ...

created字段填充时间戳;这是查询的结果SELECT created FROM mytable WHERE 1 LIMIT 5

created
----------
1308122243
1308122243
1308552690
1309247417
1309254571

但是当我执行时SELECT DATE(created) FROM mytable WHERE 1 LIMIT 5,我得到了奇怪的 NULL:

DATE(created)
-------------
2013-08-12
2013-08-12
NULL
NULL
NULL

为什么会这样?

4

5 回答 5

12

您可能正在寻找

SELECT DATE(FROM_UNIXTIME(created)) FROM mytable WHERE 1 LIMIT 5
于 2012-06-06T09:09:33.850 回答
2

发生这种情况是因为您从根本上误解了 MySQL 的日期和时间处理。你为什么将日期存储为int(10)而不是DATETIMESTAMP?那是错误的。

阅读文档。http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date

总而言之,将int转换为字符串,并将字符串解释为日期表示。1308122243 被解释为 13-08-12 加上一些额外的字符,因此转换为 2013 年 8 月 12 日。但是 1308552690 是 2013 年 8 月 55 日,因此无效,因此null.

于 2012-06-06T09:20:30.910 回答
0

我想你想要

SELECT FROM_UNIXTIME(created) FROM mytable
于 2012-06-06T09:09:54.253 回答
0

我发现了自己的错误,解决方案很简单。

如果你想让一个int(10)字段被正确解释为时间戳,你应该这样做DATE(FROM_UNIXTIME(created))而不是仅仅DATE(created).

于 2012-06-06T09:10:08.957 回答
0

你试过 FROM_UNIXTIME 吗?

SELECT DATE( FROM_UNIXTIME(`created`)) FROM mytable WHERE 1 LIMIT 5
于 2012-06-06T09:11:08.480 回答