2011-03-10 109 views
8

我在做一個查詢,如下所示:SQL DateDifference在where子句中

SELECT 
    * 
FROM a 
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3; 

,而不是工作

我試圖讓這不是超過3天的數據。

SQL服務器。

如何做到這一點?

DATEDIFF作品太慢..

回答

24

DateDiff是非常快...您的問題是,你正在運行它的數據庫表列的值,因此查詢處理器必須運行在表中的每一行的功能,即使是在此列的索引。這意味着它必須從磁盤加載整個表。

相反,使用在今天的日期的dateAdd功能,和數據庫表列與該單一計算的結果。現在它只能運行一次DateAdd(),它可以使用索引(如果存在的話),只加載符合謂詞條件的行。

Where a.DateValue > DateAdd(day,-3,getdate())

這樣做,這使得您的查詢謂詞SARG-able

+0

特區政府-能,我還沒有聽說過。謝謝! – 2011-03-10 22:42:51

+0

'查詢處理器必須運行在table'每一行的功能幫助我瞭解和解決我有一個問題,即完全一樣的語句DATEDIFF會抱怨在WHERE子句中,但不是在SELECT溢出。 – 2013-10-05 19:38:10

+0

我是有子查詢使用與DATEDIFF一個地方,這讓我瘋了,麻煩您的解決方案是偉大的,真的幫了我。非常感謝。 – FabianSilva 2014-09-23 14:44:29

0

您的查詢似乎並不壞。解決它的另一種方式是:

SELECT * FROM a WHERE a.DateValue > DATEADD(dd,-3,GETDATE())