在資料庫開發中,日期與時間函數是不可或缺的工具。無論是追蹤資料更新時間、計算使用者年齡、統計每日流量,還是實現自動時間戳記,MySQL 豐富的日期時間函數都能輕鬆應對。本文將系統整理 MySQL 的日期時間類型、常用函數、查詢技巧以及 TIMESTAMP 自動更新機制,助你高效處理時間相關業務。
MySQL 提供五種核心日期時間類型,各有適用場景:
特別提醒:MySQL 允許存儲「不嚴格合法」的日期(如 1999-11-31 或 1999-00-00),僅檢查月份 0-12、日期 0-31。應用層需自行嚴格驗證;若用於 DATE_ADD() 等運算,結果可能不準確。
SELECT CURDATE(); -- 2024-05-20
SELECT CURDATE() + 0; -- 20240520 (數值語境)
SELECT CURTIME(); -- 14:30:45
SELECT CURTIME() + 0; -- 143045 (數值語境)
SELECT NOW(); -- 2024-05-20 14:30:45
SELECT NOW() + 0; -- 20240520143045 (數值語境)
差異細節:NOW() 在語句開始執行時固定值;SYSDATE() 實時取值,主從複制場景下行為不同。
SELECT name, CURDATE() - birth AS age_days FROM pet;
-- 結果為數值格式天數差,如 80016
若需精確年齡(年),建議用 TIMESTAMPDIFF(DAY, birth, CURDATE()) 或 DATEDIFF()。
這是實現「建立時間」、「修改時間」自動維護的關鍵特性:
INSERT 未指定值、UPDATE 修改了其他欄位、顯式設為 NULL。UPDATE 時顯式設為原值:UPDATE t SET col=val, ts=ts WHERE ...;或改用 DATETIME 手動維護。錯誤寫法:WHERE entrydate = '2024-05-20' —— 只會匹配 00:00:00 那一筆。
正確寫法三種:
WHERE entrydate >= '2024-05-20' AND entrydate < '2024-05-21'WHERE entrydate LIKE '2024-05-20%'WHERE DATE(entrydate) = '2024-05-20' (注意:可能導致全表掃描)格式容錯差異:比較運算符支援多種分隔符(2024-05-20、2024/05/20、20240520 均可);LIKE 嚴格要求 YYYY-MM-DD HH:MM:SS 格式。
SELECT TO_DAYS('2024-05-20'); -- 738650
SELECT TO_DAYS(NOW()) - TO_DAYS('2024-01-01'); -- 2024 年已過天數
| 函數 | 用途 | 範例 |
|---|---|---|
| DATEDIFF(d1,d2) | 兩日期天數差 | DATEDIFF('2024-05-20','2024-01-01') → 140 |
| TIMESTAMPDIFF(unit,d1,d2) | 指定單位差值 | TIMESTAMPDIFF(DAY, '2024-01-01', NOW()) |
| DATE_ADD(d, INTERVAL n UNIT) | 日期加減 | DATE_ADD(NOW(), INTERVAL 7 DAY) |
| DATE_FORMAT(d, fmt) | 格式化輸出 | DATE_FORMAT(NOW(), '%Y年%m月%d日') |
| STR_TO_DATE(str, fmt) | 字串轉日期 | STR_TO_DATE('20/05/2024','%d/%m/%Y') |
DATETIME 存儲業務時間(不受 2038 年限制、時區固定);用 TIMESTAMP 存儲系統級建立/修改時間(自動維護、省空間)。>= 起始 AND < 結束+1天,配合索引效能最佳。