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

key*_*red 1 mysql sql date-arithmetic

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

SELECT * FROM foo WHERE event='bar' 
AND created_at >= SUBDATE(CURDATE(), 90) 
AND created_at <= CURDATE()
Run Code Online (Sandbox Code Playgroud)

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

我已经检查了一些资料,包括MySQL参考手册,还没有给出任何实际答案。查询中可能包含当前时间的某些元素,还是在关门之后进行了其他业务?

jer*_*ith 6

如果您的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
Run Code Online (Sandbox Code Playgroud)