標準格式:'YYYY-MM-DD' (如 '2024-12-31')。
MySQL 接受「寬鬆格式」:任何標點作為分隔符,甚至無分隔符:
'2024-12-31' '2024/12/31' '2024.12.31' '2024 12 31' '20241231'
'24-12-31' '24#12#31' '2024#12#31' -- 兩位數年份 2000-2069 窗口
| 比較場景 | 轉換方式 | 說明 |
|---|---|---|
| 日期欄位 vs 常量字串 | 字串 → 長整數 (YYYYMMDD) | 快速比較,支援寬鬆格式 |
| 日期欄位 vs 日期欄位 | 字串比較 | 逐字符比較,較慢 |
| 日期欄位 vs 表達式 | 字串比較 | 如 WHERE dt > DATE_SUB(NOW(), INTERVAL 1 DAY) |
| IN / STRCMP() | 字串比較 | 不走數值快速路徑 |
-- 1. 統一用標準格式字串常量
WHERE dt >= '2024-01-01' AND dt < '2024-02-01'
-- 2. 日期函數生成邊界
WHERE dt >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
-- 3. 避免函數包裹索引欄
-- 慢:WHERE DATE(dt) = '2024-01-01'
-- 快:WHERE dt >= '2024-01-01' AND dt < '2024-01-02'
-- 4. 顯式轉換消除歧義
WHERE dt = CAST('2024-01-01' AS DATE)
NO_ZERO_DATE) 下禁止寫入DATE('0000-00-00') 返回 NULLINSERT INTO t (dt) VALUES (20240101); -- 數值 → 日期
INSERT INTO t (dt) VALUES ('20240101'); -- 無分隔符字串
SELECT dt + 0 FROM t; -- 日期 → 數值 20240101
SELECT MOD(dt, 100) FROM t; -- 取日部分 → 1
DATE:無時區概念,存什麼讀什麼TIMESTAMP:存儲 UTC,讀取轉換為會話時區TIMESTAMP 或應用層處理 DATE 時區WHERE dt = '2024-1-1' (月/日未補零) → 依賴寬鬆解析,建議統一 DATE_FORMAT 或應用層格式化BETWEEN '2024-01-01' AND '2024-01-31' 包含 31 日 23:59:59,若欄位為 DATETIME 會漏掉當天資料 → 用半開區間 dt >= '2024-01-01' AND dt < '2024-02-01'WHERE DATE(dt) = ...、WHERE YEAR(dt) = 2024