前端傳入或日曆控件產生的日期格式通常為 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' -- 同理無結果
-- 將 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 字元即日期部分。
| 無世紀 (yy) | 有世紀 (yyyy) | 標準 | 輸出範例 | 備註 |
|---|---|---|---|---|
| 0 / 100 | - | 預設 | mon dd yyyy hh:miAM/PM | 預設值 |
| 1 / 101 | - | 美國 | mm/dd/yy / mm/dd/yyyy | - |
| 2 / 102 | - | ANSI | yy.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 | - | ISO | yymmdd / yyyymmdd | 純數字日期 |
| 13 / 113 | - | 歐洲預設+毫秒 | dd mon yyyy hh:mm:ss:mmm | 24h 制 |
| 14 / 114 | - | - | hh:mi:ss:mmm | 24h 制時間+毫秒 |
| 20 / 120 | - | ODBC | yyyy-mm-dd hh:mi:ss | **最常用** |
| 21 / 121 | - | ODBC+毫秒 | yyyy-mm-dd hh:mi:ss.mmm | 精確到毫秒 |
| - / 126 | - | ISO8601 | yyyy-mm-ddThh:mm:ss.mmm | XML 標準,無空格 |
| 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
DateTime 物件,避免字串格式問題WHERE fielddate >= '2008-02-27' AND fielddate < '2008-02-28' 可用索引,無需 CONVERTdate_only AS CONVERT(date, datetime_col) 建索引,查詢直接用 date_onlyCONVERT(field) = ... 導致掃描;改寫為 field >= ... AND field < ... 利用索引