2009-09-15 54 views
50

我正在使用MS SQL 2005,我想檢查兩個日期是否相等,但忽略時間部分。在T-SQL中比較日期,忽略時間部分

我知道我可以利用DATEDIFF,但擔心它可能會很慢 - 這個SP會在DB中使用很多!

有什麼建議嗎?

編輯:大衛Andres的評論:

‘‘比較’包括除平等’
更使我意識到,我沒有讓我的問題很清楚 - 我其實只是檢查平等,這是所有。

+10

不要擔心過早優化:使用'DATEDIFF'編寫查詢,然後查看它是否是瓶頸或者不在檢查查詢計劃。如果這是一個問題,尋找替代品。 – Welbog 2009-09-15 14:21:27

+0

[在SQL Server中刪除時間部分日期時間的最佳方法]的可能的重複(http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-服務器) – abatishchev 2017-03-21 17:56:29

回答

81

唯一合理的方式做到這一點是要剝去的日期時間值的時間部分,其結果,並從日期時間剝離的時間部分的最佳方式比較是這樣的:

cast(current_timestamp as date)  

我曾經使用和主張看起來像下面兩行的一個過程:

cast(floor(cast(getdate() as float)) as datetime) 
dateadd(dd,0, datediff(dd,0, getDate())) 

但現在的SQL Server有Date類型,它不持有時間部分,沒有理由要麼使用這些技術。

這裏要記住的另一件事是,如果您需要爲where子句或連接條件中的每個行的兩個日期時間值執行此操作,這仍然會妨礙查詢。如果可能的話,您希望以某種方式將其分解,以便儘可能預先計算,例如使用視圖或計算列。

最後,請注意DATEDIFF函數比較交叉邊界的數量。因此,'2009-09-14 11:59:59''2009-09-15 00:00:01'之間的日期中的日期爲1,即使僅經過了2秒,但'2009-09-15 00:00:01''2009-09-15 11:59:59'之間的天數DATEDIFF仍然爲零,即使86,398秒過去了。請注意,它並不真正關心那裏的時間部分。根據您的查詢嘗試執行的操作,您可能會將其用於您的優勢。

+3

不會比僅僅使用_D​​ATEDIFF(day,date1,date2)_更低效嗎? – 2009-09-15 14:24:31

+0

我正在編輯 - 現在就準備好了。 – 2009-09-15 14:27:06

+2

我並不是在尋找一種脫離時間的方式,而是一種比較兩個日期而忽略時間的方法。這看起來有點慢.. – 2009-09-15 14:31:35

6

在我自己的工作,當我想以確定兩個日期都是平等的,不論一天中的時間,我已經使用了以下內容:

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101) 

誠然,「比較」包括除平等得多和在進行比較之前,上面將日期轉換爲美國格式MM/DD/YYYY。因此,性能影響和無法比較日期差異。

但是......它確實有效。

4

如果您的業務需求中有一項不適合您的數據模型(例如,您需要比較日期,但您沒有記錄日期,僅記錄日期和時間),看看調整模型的可能性,而不是應對它的方法。

將日期存儲在索引計算列中,還是單獨存儲日期和時間部分是否可行和有幫助?

33

WHERE DATEDIFF(day,date1,date2)= 0

2

對不起,對於遲到的答案。

我總是用這句法日期比較

WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112) 

當我們轉換與112格式代碼日期它yyyyMMdd格式返回日期總是偉大工程。它比較沒有時間的字符串格式的日期,但效果很好。謝謝

+0

您的解決方案適用於我在寫「IF date_column!= GETDATE()」時沒有寫過的腳本。 你碰巧知道這是爲什麼? – CryptoJones 2015-05-19 21:32:04