使用者輸入 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 問題)。
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。
上述查詢會包含 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'結束日期必須加一天,否則當天資料會被漏查。