[英]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.