'YYYY-MM-DD' (ISO 8601)INSERT INTO t (dt) VALUES
('2024-01-15'), -- 標準
('2024/01/15'), -- 斜線分隔
('2024.01.15'), -- 點分隔
('2024 01 15'), -- 空格分隔
('20240115'), -- 無分隔符
(20240115); -- 數值字面量
所有以上寫入結果相同:2024-01-15。
| 比較場景 | 轉換方式 | 效能 |
|---|---|---|
日期欄位 <= 常量字串 | 字串 → 長整數 (內部日期數) | 快速,索引可用 |
日期欄位 BETWEEN 常量 | 同上 | 快速 |
| 兩個日期欄位比較 | 字串比較 | 較慢,可能失效索引 |
日期欄位 IN 列表 / STRCMP() | 字串比較 | 較慢 |
'0000-00-00':「零日期」,可儲存/讀取,NO_ZERO_DATE 模式下禁止。NULL。0,讀取為 '0000-00-00'。-- 嚴格模式:拒絕零日期、零月/日
SET sql_mode = 'NO_ZERO_DATE,NO_ZERO_IN_DATE';
-- 寬鬆模式(預設):允許 '2024-00-00'、'0000-00-00'
SET sql_mode = '';
Web 應用常用寬鬆模式接收前端分離的 年/月/日,避免前端驗證漏網。
-- 日期運算
SELECT DATE_ADD('2024-01-15', INTERVAL 10 DAY);
SELECT DATEDIFF('2024-12-31', '2024-01-01');
-- 格式化輸出
SELECT DATE_FORMAT(dt, '%Y年%m月%d日') FROM t;
-- 截取部分
SELECT YEAR(dt), MONTH(dt), DAY(dt) FROM t;
WHERE dt = '2024-1-1' (單位數月/日) 會轉字串比較,索引失效 → 統一補零 '2024-01-01'。TIMESTAMP 儲存為 UTC,讀取轉換為 Session 時區;DATETIME 不轉換。跨時區應用優先用 TIMESTAMP。WHERE dt >= '2024-01-01' AND dt < '2024-02-01' 比 BETWEEN 更安全(避免時間元件導致漏查)。