2011-01-31 46 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