2009-08-01 72 views
0

我正在使用SQL Server 2008.我有一個表,它有一個名爲CreateTime的日期時間類型列。我需要從該表中選擇所有記錄的CreateTime超過3天,從當前時間(UTC時間)起半小時。我正在使用T-SQL存儲過程。SQL Server中的DateDiff尋求幫助

順便說一句:CreateTime列是過去一段時間。

我花了相當多的時間學習和搜索DateDiff的MSDN幫助,但無法弄清楚。任何人都可以給我看一個樣品嗎?

由於事先 喬治

回答

5

您可以選擇和使用分鐘,並DATEDIFF添加一個WHERE子句:

SELECT (fields) 
FROM (table) 
WHERE 
    DATEDIFF(MINUTE, CREATETIME, getutcdate()) <= (3*24*60 + 30) 

當然,如果你只想要那些行更多超過3天,30分鐘的路程,只需使用相反:

WHERE 
    DATEDIFF(MINUTE, CREATETIME, getutcdate()) > (3*24*60 + 30) 

樣品:

SELECT  
    DATEDIFF(MINUTE, '2009-08-01 08:00:00', getutcdate()), 
    DATEDIFF(MINUTE, '2009-07-31 20:00:00', getutcdate()), 
    DATEDIFF(MINUTE, '2009-07-23 20:00:00', getutcdate()) 

給出作爲結果:

96 816 12337 

所以前兩個日期仍然在4350分鐘的括號內(小於3天和30分鐘前),而第三次日期更遠。

馬克

3

您需要DATEADD

WHERE DATEADD(minute, 4350, CreateTime) <= getutcdate() 

或者,正如你所說,你可以使用DATEDIFF

WHERE DATEDIFF(minute, CreateTime, getutcdate()) <= 4350 

(4350是「3天30分鐘)

+1

這個問題實際上是規定了3天,一個半小時,而不是1天。 – Amber 2009-08-01 09:19:37

+1

被抓住了。更新。 – 2009-08-01 09:21:40

2

一個小問題給定答案,雖然他們是正確的。不要將函數應用於列:將函數應用於比較值。

如果CREATETIME被索引,那麼它是掃描而不是使用列上的函數進行查找。 您不需要數百萬行來解決這個問題。

適應marc_s的答案:

SELECT (fields) 
FROM (table) 
WHERE 
    CREATETIME <= DATEADD(MINUTE, - (3*24*60 + 30), getutcdate())