2011-01-31 238 views
0

我试图使用curdate()检索我的数据库中的条目,我认为有一些我不知道的底层逻辑。例如:curdate()如何在MySQL中进行比较

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

如果您的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 
+0

1:有疑问时,检查列的数据类型 - MySQL有DATE和DATETIME。 – 2011-01-31 19:00:28