2011-10-27 51 views
2

我有表(名为tasks)列created_at,基本上,它包含UNIX时间戳。如何比较MySQL中的日期?

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

区间为today,tomorrow,this weekthis month

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

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

因此,我通过时间戳来查询和比较(检查?)它在指定的时间间隔内存储在数据库中。要转换,我需要使用FROM_UNIXTIME,对吧?

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

回答

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

+0

@Tadeck,谢谢你:-) – Johan

+0

没问题,只是简单的错字:) – Tadeck

+0

谢谢,约翰。例如,这个月呢?我需要把多少作为间隔? 30? – daGrevis

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()内置函数(获取当前周/月的第一秒的时间戳)的更复杂的逻辑。