Sql-Server
在 where 子句中使用 datetime 和 date 數據類型時是否存在中斷?
我有一個標題為completed_date的專欄。在我的查詢中,該列的大多數值都是2016-09-30 23:59:59.997。
然後我有一個 where 子句,內容如下:
WHERE achieved_date between '20160901' and '20160930'
具有 2016-09-30 23:59:59.997 值的記錄不應該包含在我的結果中。我的意思是交易記錄在 9 月 30 日。
如果這是一個奇怪的數據類型問題,有什麼想法嗎?
停止
BETWEEN
用於日期範圍查詢;它是模棱兩可和脆弱的。WHERE COL >= '20160901' and COL < '20161001'
構造起來要容易得多,並且不易受到類型/精度/舍入的意外變化的影響。
我必須同意 Aaron Bertrand 的觀點。在這種情況下使用“介於”會在閱讀程式碼時引入一定程度的歧義。使用更具體的運算符 =、>=、<= 等,將提供更易讀的程式碼和可靠的結果。
我也同意 SQLDataInTraining 的觀點,因為所涉及的隱式轉換實際上導致您的結果不返回預期的記錄。另一個選擇是轉換 DB 值而不是文字日期值。
所以而不是
WHERE achieved_date > CAST('20160901' AS DATE) AND achieved_date <= CAST('20160930' AS DATE)
嘗試這個
WHERE CAST(achieved_date AS DATE) >= '20160901' AND CAST(achieved_date AS DATE) <= '20160930'
這當然是假設您想要 20160901 和 20160930 的所有記錄。如果沒有,請相應地調整運算符。