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

SQL Server 日期比較大小正確姿勢:CONVERT 風格代碼完整表與避坑指南

     編輯:關於SqlServer

常見錯誤

-- 字串比較而非日期比較!
SELECT * FROM recharge_info WHERE date < '2023-09-22' AND date > '2023-09-01';
-- 若 date 為 VARCHAR,'2023-09-2' > '2023-09-22' (字典序),結果錯誤

核心函數:CONVERT

CONVERT(data_type(length), expression, style)
-- style 決定輸出格式,常用代碼見下表

常用 Style 代碼完整表

Style標準輸出範例 (2023-09-22 10:57:49.123)備註
0/100預設Sep 22 2023 10:57AMmon dd yyyy hh:miAM
1/101美國09/22/2023mm/dd/yyyy
2/102ANSI2023.09.22yyyy.mm.dd
3/103英/法22/09/2023dd/mm/yyyy
4/104德22.09.2023dd.mm.yyyy
5/105義22-09-2023dd-mm-yyyy
6/106-22 Sep 2023dd mon yyyy
7/107-Sep 22, 2023mon dd, yyyy
8/108-10:57:49hh:mi:ss
9/109預設+毫秒Sep 22 2023 10:57:49:123AM
10/110美09-22-2023mm-dd-yyyy
11/111日2023/09/22yyyy/mm/dd
12/112ISO20230922yyyymmdd
13/113歐洲預設22 Sep 2023 10:57:49:12324h
14/114-10:57:49:12324h+毫秒
20/120ODBC2023-09-22 10:57:49yyyy-mm-dd hh:mi:ss
21/121ODBC+毫秒2023-09-22 10:57:49.123yyyy-mm-dd hh:mi:ss.mmm
126ISO86012023-09-22T10:57:49.123XML/JSON 標準
130Hijri... (伊斯蘭曆)科威特演算法
131Hijri.../.../... ...

規律:style ≥ 100 含世紀 (yyyy);style < 100 兩位年 (yy),易造成 2000 年問題,生產環境禁用。

正確日期範圍查詢寫法

-- 參數為日期型別 (最佳)
DECLARE @start DATE = '2023-09-01', @end DATE = '2023-09-22';
SELECT * FROM recharge_info 
WHERE recharge_date >= @start AND recharge_date < DATEADD(DAY, 1, @end);

-- 參數為字串,顯式轉換
SELECT * FROM recharge_info 
WHERE recharge_date >= CONVERT(DATE, '2023-09-01', 120)
  AND recharge_date < CONVERT(DATE, '2023-09-23', 120);  -- 開區間避免時間分量

⚠️ 關鍵避坑

  1. 永遠不要用字串直接比較日期欄位:隱式轉換、索引失效、邏輯錯誤
  2. 用開區間 >= 開始 AND < 結束+1天:包含結束日全天,避免 23:59:59.997 精度問題
  3. 索引欄位不加函數:WHERE CONVERT(DATE, dt) = ... 失效,改用範圍查詢
  4. 跨時區/跨語系環境:統一用 style 120/121/126 無歧義格式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved