簡體   English   中英

比較 T-SQL 中的日期,忽略時間部分

[英]Compare dates in T-SQL, ignoring the time part

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

我知道我可以使用DATEDIFF ,但我擔心它可能會很慢 - 這個 SP 在數據庫中得到了很多使用!

有什么建議?

編輯:大衛安德烈斯的評論:

““比較”不僅僅包括平等”
讓我意識到我沒有把我的問題說得足夠清楚——我實際上只是在檢查平等,僅此而已。

最合理的方法是剝離日期時間值的時間部分並比較結果,從日期時間剝離時間部分的最佳方法是這樣的:

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'之間的 datediff 為 1,即使只過去了 2 秒,但'2009-09-15 00:00:01'之間'2009-09-15 00:00:01'天數 DATEDIFF '2009-09-15 00:00:01''2009-09-15 11:59:59'仍然為零,即使已經過去了 86,398 秒。 它根本不關心那里的時間部分,只關心邊界。 根據您的查詢嘗試執行的操作,您或許可以利用它來發揮自己的優勢。

WHERE DATEDIFF(day, date1, date2)=0

在我自己的工作中,當我想確定兩個日期在一天中的任何時間都相等時,我使用了以下內容:

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

誠然,“比較”不僅僅包括相等,而且在進行比較之前,上面將日期轉換為美國格式 MM/DD/YYYY。 因此,性能影響和無法比較日期差異。

但是……確實有效。

如果您的數據模型不能很好地滿足您的業務需求之一(例如,您需要比較日期,但您沒有跟蹤日期,僅跟蹤日期加時間),請查看可能性調整模型,而不是處理它的方法。

將僅日期存儲在索引計算列中,或者單獨存儲日期和時間部分是否可能並有幫助?

抱歉回復晚了。

我總是使用這種語法進行日期比較

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM