首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

另類解讀 SQL Server DateTime 型別:相等比較的兩種正確姿勢與 BETWEEN 陷阱

     編輯:關於SqlServer

核心問題

使用者輸入 yyyy/mm/dd (無時間),資料庫儲存含時分秒。如何正確比較「日期相等」(年月日相同)?

方法一:拆解年月日逐一比較 (直觀但冗長)

WHERE YEAR(Col) = @Year AND MONTH(Col) = @Month AND DAY(Col) = @Day
-- 或統一格式字串比較
WHERE CONVERT(VARCHAR(10), Col, 111) = CONVERT(VARCHAR(10), @Date, 111)

缺點:幾乎用遍日期函數,無法使用索引 (SARGable 問題)。

方法二:BETWEEN 範圍查詢 (推薦,可用索引)

SQL Server 若僅指定日期,時間預設 00:00:00 (午夜)。欲查 2004-07-10 全天:

WHERE Col BETWEEN CAST('2004-07-10' AS DATETIME) 
              AND DATEADD(DAY, 1, CAST('2004-07-10' AS DATETIME))

含義:2004-07-10 00:00:00.000 至 2004-07-11 00:00:00.000。

BETWEEN 微小缺陷與完美修正

上述查詢會包含 7/11 00:00:00.000 那一刻 (理論上屬 7/11)。極少見但嚴格場景下:

WHERE Col >= CAST('2004-07-10' AS DATETIME)
  AND Col < DATEADD(DAY, 1, CAST('2004-07-10' AS DATETIME))

半開區間 [開始, 結束) 完美排除邊界問題,且同樣可用索引。

延伸:大於/小於日期同理

  • Col > '2004-07-10' 實際為 Col >= '2004-07-11'
  • Col < '2004-07-10' 實際為 Col < '2004-07-10 00:00:00'

關鍵提醒

結束日期必須加一天,否則當天資料會被漏查。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved