2012-05-26 2113 views

回答

15

讓爲你失去任何查詢緩存或優化,因爲查詢每次都是不同的不使用NOW()。請參閱MySQL documentation中不應使用的功能列表。

在下面的代碼中,我們假設這張表隨着時間而增長。新的東西被添加,你想顯示在過去30天的東西。這是最常見的情況。

請注意日期已添加爲字符串。最好從你的調用代碼中以這種方式添加日期,而不是使用NOW()函數,因爲它會殺死緩存。

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY); 

您可以使用BETWEEN,如果你真的只是想的東西就在這個第二個30天在此之前很第二,但是這不是一個常見的情況在我的經驗,所以我希望簡化查詢可以爲你服務好。

+2

所以你建議不要使用'NOW()'並且仍然在你的答案中使用它。 o_O PS:您的查詢將返回**另一個**結果,而不是OP可能想要的結果 – zerkms

+0

@zerkms此查詢如何產生與查詢不同的結果集? – user784637

+1

@ user784637:uhm,'BETWEEN'和'> ='是不同的操作符,你知道嗎?我的查詢限制了「30天前和今天」的結果集,這是「30天前後的所有內容」。所以'明天'記錄不匹配我的和你原來的查詢,但會匹配這個答案 – zerkms

4

的MySQL減去從現在天:

select now(), now() - interval 1 day 

打印:

2014-10-08 09:00:56  2014-10-07 09:00:56 
75

爲了誰不希望使用DATE_SUB,使用CURRENT_DATE

SELECT CURRENT_DATE - INTERVAL 30 DAY 
+1

如果可以的話,我會給這個+10。 SQL應該都是關於可讀性的,並且這是執行此操作最可讀的方式。 –

+7

比使用NOW() - INTERVAL 30 DAY更具可讀性但不同的結果。由於問題提到「從當前**日期時間減去30天**」,這可能不是OP想要的。 –

0

另一方式

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ; 
-1

如果您只需要日期,而不是使用時間:

select*from table where exec_datetime 
between subdate(curdate(), 30)and curdate(); 

由於curdate()省略時間部分,它比now()更快potentially並在那裏你只能是案件多「語義正確」對日期感興趣。

另外,subdate()的2值過載可能比使用interval更快。 interval適用於您需要非日間組件的情況。

+11

所以,你聲稱'subdate(curdate(),30)'比'CURRENT_DATE - INTERVAL 30 DAY'要糟嗎?你有證據嗎?那會有多快?幾微秒? –

+0

@ypercube,哇,這個評論如何得到+5票,一天...你做了什麼?另外,我在帖子中澄清說它「可能更快」。 – Pacerier

+2

我不知道。我當然不能贊成我自己的評論。關於「潛在」更快的主張,我仍然看不到任何證據,決定性或間接性。即使速度稍快,條件也會被評估一次。除非您每分鐘運行查詢數百萬次,否則差異將無關緊要。 –

1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y') 

您可以通過在SQL中使用日期格式進行格式化。

7

您還可以使用

select CURDATE()-INTERVAL 30 DAY