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

SQL Server 日期查詢陷阱與 CONVERT 格式化完整解析

     編輯:關於SqlServer

問題背景

前端傳入或日曆控件產生的日期格式通常為 yyyy-mm-dd,但資料庫欄位為 datetime(含時分秒 yyyy-mm-dd hh:mm:ss)。直接用 = 或 BETWEEN 查詢會導致資料遺漏。

失效範例

-- 假設資料庫有 2008-02-27 14:30:00 的資料
WHERE fielddate = '2008-02-27'                    -- 無結果(比對 00:00:00)
WHERE fielddate BETWEEN '2008-02-27' AND '2008-02-27'  -- 同理無結果

解決方案:CONVERT 截取日期部分比對

-- 將 datetime 轉為 yyyy-mm-dd (10 字元) 再比對
WHERE CONVERT(varchar(10), fielddate, 120) = '2008-02-27'

-- 或 BETWEEN 範圍查詢
WHERE CONVERT(varchar(10), fielddate, 120) BETWEEN '2008-02-27' AND '2008-02-28'

關鍵:style 120 (ODBC 標準) 輸出 yyyy-mm-dd hh:mi:ss,varchar(10) 截取前 10 字元即日期部分。

CONVERT 格式代碼完整對照表

無世紀 (yy)有世紀 (yyyy)標準輸出範例備註
0 / 100-預設mon dd yyyy hh:miAM/PM預設值
1 / 101-美國mm/dd/yy / mm/dd/yyyy-
2 / 102-ANSIyy.mm.dd / yyyy.mm.dd-
3 / 103-英/法dd/mm/yy / dd/mm/yyyy-
4 / 104-德dd.mm.yy / dd.mm.yyyy-
5 / 105-義dd-mm-yy / dd-mm-yyyy-
6 / 106--dd mon yy / dd mon yyyy-
7 / 107--mon dd, yy / mon dd, yyyy-
8 / 108--hh:mm:ss僅時間
9 / 109-預設+毫秒mon dd yyyy hh:mi:ss:mmmAM/PM-
10 / 110-美國mm-dd-yy / mm-dd-yyyy-
11 / 111-日本yy/mm/dd / yyyy/mm/dd-
12 / 112-ISOyymmdd / yyyymmdd純數字日期
13 / 113-歐洲預設+毫秒dd mon yyyy hh:mm:ss:mmm24h 制
14 / 114--hh:mi:ss:mmm24h 制時間+毫秒
20 / 120-ODBCyyyy-mm-dd hh:mi:ss**最常用**
21 / 121-ODBC+毫秒yyyy-mm-dd hh:mi:ss.mmm精確到毫秒
- / 126-ISO8601yyyy-mm-ddThh:mm:ss.mmmXML 標準,無空格
130 / 131-科威特希吉拉曆格式特殊地區

常用格式化範例

-- 完整日期時間
SELECT CONVERT(varchar, GETDATE(), 120)        -- 2004-09-12 11:06:08

-- 純數字時間戳 (檔案命名等)
SELECT REPLACE(REPLACE(REPLACE(CONVERT(varchar, GETDATE(), 120), '-', ''), ' ', ''), ':', '')  -- 20040912110608

-- 日期格式
SELECT CONVERT(varchar(10), GETDATE(), 111)    -- 2004/09/12
SELECT CONVERT(varchar(8), GETDATE(), 112)     -- 20040912
SELECT CONVERT(varchar(10), GETDATE(), 102)    -- 2004.09.12
SELECT CONVERT(varchar(10), GETDATE(), 101)    -- 09/12/2004
SELECT CONVERT(varchar(10), GETDATE(), 103)    -- 12/09/2004
SELECT CONVERT(varchar(10), GETDATE(), 104)    -- 12.09.2004
SELECT CONVERT(varchar(10), GETDATE(), 105)    -- 12-09-2004
SELECT CONVERT(varchar(10), GETDATE(), 106)    -- 12 09 2004
SELECT CONVERT(varchar(10), GETDATE(), 107)    -- 09 12, 2004

-- 僅時間
SELECT CONVERT(varchar(8), GETDATE(), 108)     -- 11:06:08
SELECT CONVERT(varchar(12), GETDATE(), 114)    -- 11:06:08.177

最佳實踐建議

  1. 參數化查詢:應用層傳入 DateTime 物件,避免字串格式問題
  2. 範圍查詢替代等值:WHERE fielddate >= '2008-02-27' AND fielddate < '2008-02-28' 可用索引,無需 CONVERT
  3. 計算欄位 + 索引:SQL 2000+ 支援持久化計算欄位 date_only AS CONVERT(date, datetime_col) 建索引,查詢直接用 date_only
  4. 避免欄位端函數:CONVERT(field) = ... 導致掃描;改寫為 field >= ... AND field < ... 利用索引
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved