在資料庫開發中,日期時間的運算與篩選是高頻需求。MySQL 提供了豐富的內建函數,掌握核心語法能大幅提升查詢效率。以下整理實務上最常用的日期處理模式,供快速參考。
利用 CURDATE() 取得當前日期(不含時間),搭配 DATE() 將欄位截取為日期部分進行比對:
SELECT * FROM `table_name` WHERE DATE(`datetime_column`) = CURDATE();
這寫法能正確命中索引(若欄位有索引),避免隱含轉換導致全表掃描。
使用 NOW() 取得完整日期時間,配合 DATE_SUB() 扣減間隔,再用 DATE_FORMAT() 格式化輸出:
SELECT
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS `now`,
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%s') AS `yesterday`;
進階技巧:若需「零點零分」作為當日邊界,可改用 CURDATE() 直接運算:
SELECT
CURDATE() AS `today_start`,
DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS `yesterday_start`;
| 單位關鍵字 | 說明 |
|---|---|
| SECOND / MINUTE / HOUR | 秒 / 分 / 時 |
| DAY / WEEK / MONTH | 日 / 週 / 月 |
| QUARTER / YEAR | 季 / 年 |
| SECOND_MICROSECOND | 秒.微秒(複合單位) |
複合單位如 INTERVAL '1:30' HOUR_MINUTE 表示 1 小時 30 分鐘,靈活應對精細運算需求。
WHERE DATE(col) = ... 會使索引失效,大表建議改用範圍查詢 WHERE col >= '2024-01-01' AND col < '2024-01-02'。NOW() 與 UTC_TIMESTAMP() 混用造成邏輯錯誤。DATE_FORMAT() 耗能較高,僅在最終 SELECT 列表使用,勿用於 JOIN 或 WHERE 條件。掌握這幾組核心模式,即可應對 90% 的日期處理場景,減少試錯時間,專注業務邏輯開發。