我正在尝试使用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参考手册,并没有提出任何真正的答案。是否有可能当前时间的某些元素被包含在查询中,或者其他一些业务是否会闭门造车?
答案 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