curdate()如何在MySQL中进行比较

时间:2011-01-31 18:51:36

标签: sql mysql date-arithmetic

我正在尝试使用curdate()检索数据库中的条目,我认为有一些我不知道的基本逻辑。例如:

SELECT * FROM foo WHERE event='bar' 
AND created_at >= SUBDATE(CURDATE(), 90) 
AND created_at <= CURDATE()

此调用将返回前90天,但它没有今天的任何条目。据我所知,curdate()只是YYYY-MM-DD或YYYYMMDD并且完全忽略了一天中的时间,我们将其保存为curtime()和now()。我怀疑时间被包含在这里的某个地方,因为当我在Rails中进行类似的调用并将日期作为DateTime.beginning_of_day传递时,它可以工作,而其他任何方式都不包括今天到某个小时。

我查了几个来源,包括MySQL参考手册,并没有提出任何真正的答案。是否有可能当前时间的某些元素被包含在查询中,或者其他一些业务是否会闭门造车?

1 个答案:

答案 0 :(得分:4)

如果您的created_at列是完整的datetime类型,那么在与日期进行比较时,它将占用该日期的开头。

因此,与2011-01-01相比,类似于与2011-01-01 00:00:00进行比较。这就是为什么你没有收到CURDATE()的任何内容(除非created_at时间戳在该日期的完全午夜)。

示例:

select curdate();
-- 2011-01-31

select cast(curdate() as datetime);
-- 2011-01-31 00:00:00

select if('2011-01-31' <= curdate(), 'yep', 'not this time');
-- yep

select if('2011-01-31 00:00:01' <= curdate(), 'yep', 'not this time');
-- not this time

select if('2011-01-31 01:00:00' <= adddate(curdate(), interval 1 day), 'yep', 'not this time');
-- yep