1

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

4

1 回答 1

7

如果您的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
于 2011-01-31T18:58:12.057 回答