Sql-Server

在 where 子句中使用 datetime 和 date 數據類型時是否存在中斷?

  • May 7, 2020

我有一個標題為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 &gt; CAST('20160901' AS DATE) 
AND achieved_date &lt;= CAST('20160930' AS DATE)

嘗試這個

WHERE CAST(achieved_date AS DATE) &gt;= '20160901' 
 AND CAST(achieved_date AS DATE) &lt;= '20160930'

這當然是假設您想要 20160901 和 20160930 的所有記錄。如果沒有,請相應地調整運算符。

引用自:https://dba.stackexchange.com/questions/153391