2013-10-11 141 views
0

我正在瀏覽前任編寫的腳本。在t-sql中減去兩個日期

有人能向我解釋爲什麼會有這種說法

--- CreatedDateTime is a datetime column in SALES_ORDER table. 
SELECT * FROM SALES_ORDER 
WHERE GETDATE() - CreatedDateTime < 1 

返回相同的結果

SELECT * FROM SALES_ORDER 
WHERE DateDiff(hh,CreatedDateTime, GetDate()) < 24 
+0

因爲1天等於24小時 –

+0

我想那麼多。但我無法找到任何文件。日期時間值之間的減法結果是日期時間值。在這種情況下,它如何評估/比較爲「1天」?鑄件? –

回答

1

兩個布爾表達式評價同一件事。無論是24小時還是1天。順便提一句,它們都不包括CreatedDateTime列中索引的使用情況。

SELECT * FROM SALES_ORDER 
    WHERE CreatedDateTime > GETDATE() - 1 

或本(小於一日齡):

SELECT * FROM SALES_ORDER 
    WHERE CreatedDateTime > DateAdd(dd,-1,GetDate()) 
如果你有此列的索引,想提高它的使用那麼十有八九你會更喜歡這樣寫

或該(小於86400000毫秒舊舊):

SELECT * FROM SALES_ORDER 
    WHERE CreatedDateTime > DateAdd(ms,-86400000,GetDate()) 
3

一個DATETIME一個的減法是記錄here:「也可以從日期中減去一個數字,以天爲單位。」

declare @Now as DateTime = GetDate(); 
declare @OneWeekAgo as SQL_Variant = @Now - 7; 

select @Now as [Now], @OneWeekAgo as [Delta], SQL_Variant_Property(@OneWeekAgo, 'BaseType') as [Data Type]; 

Using Operators with Date and Time Data Types:「加減法用於所有日期和時間數據類型,使用DATEADD和DATEDIFF。」

在可能的違規行爲,我們看到下面的好奇結果Principle of Least Astonishment的:

declare @Now as DateTime = GetDate(); 
declare @Then as DateTime = '17760704'; 
declare @Delta as SQL_Variant = @Now - @Then; 

select @Now as [Now], @Then as [Then], @Delta as [Delta], 
    SQL_Variant_Property(@Delta, 'BaseType') as [Data Type], 
    Cast(@Delta as Int) as [Days]; 

阿龍貝特朗條款:所提供的信息是由阿龍貝特朗未經批准。此外,作者未能指出在任何特定環境下可能不適用或不理想的所有可能方式,無論這些方式多麼模糊或人爲設計。作者還犯了基數和/或序數罪,沒有明確提及Aaron Bertrand的博客文章至少三(3)個標準答案。因此它不會給整個社區帶來任何好處,作者應立即永久地從所有StackExchange站點放逐,並且作者提供的任何內容都應從中刪除。微軟精彩的文檔可能導致任何(錯誤)理解的程度並不重要。

+0

讓我發笑的+1 – UnhandledExcepSean

+0

我大聲說笑,直到我滑倒,不小心關閉了我的所有亞倫伯特蘭博客。 –

+2

什麼.....? –