如何比较MySQL中的日期?

时间:2011-10-27 12:13:29

标签: mysql datetime date time intervals

我的表(名为tasks)的列created_at基本上包含UNIX时间戳。

我只需要选择在指定的时间间隔内创建的结果。

间隔为todaytomorrowthis weekthis month

我认为如果我将时间戳转换为YYYY-MM-DD HH:MM:SS格式,MySQL就可以处理它。

另外,我认为我也需要在那里使用BETWEEN

所以,我传递时间戳来查询和比较(检查?)它是否在指定的时间间隔内存储在数据库中的时间戳。要转换,我需要使用FROM_UNIXTIME,对吧?

如何指定这些间隔?谢谢你的建议!

2 个答案:

答案 0 :(得分:7)

您需要转换UNIX_TIMESTAMP。

查询

SELECT * FROM tasks
WHERE created_at BETWEEN UNIX_TIMESTAMP(DATE_SUB(now(),INTERVAL 1 DAY)) 
                     AND UNIX_TIMESTAMP(now())

您可以通过执行以下操作来更改周,月等的间隔:

INTERVAL 1 WEEK
INTERVAL 1 MONTH
INTERVAL 1 YEAR

MySQL将自动考虑月份和闰年等的长度。

在上面的查询中,MySQL将能够使用索引,从而加速了很多事情 确保在列上使用函数,因为在这种情况下,MySQL不能在该字段上使用索引,从而导致严重的缓慢。

编码恐怖,非常慢

SELECT * FROM tasks 
WHERE FROM_UNIXTIME(created_at) BETWEEN DATE_SUB(now(),INTERVAL 1 DAY) 
                                    AND now()

请参阅:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

答案 1 :(得分:1)

我猜created_at被定义为INT,你在其中存储时间戳。那么今天的最佳方式是:

created_at BETWEEN UNIX_TIMESTAMP(CURDATE()) AND UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY)

请注意以下内容也适用:

FROM_UNIXTIME(created_at) BETWEEN CURDATE() AND (CURDATE() + INTERVAL 1 DAY)

,但你可能没有机会让MySQL使用列索引。对于周/月,您需要使用WEEK()和MONTH()内置函数的更复杂逻辑(以获取当前周/月的第一秒的时间戳)。