業務報表常需按時間維度篩選資料。本文整理 MySQL 常用時間範圍查詢模式,並附核心日期函數速查表。
-- 方法一:TO_DAYS 比對
SELECT * FROM `table` WHERE TO_DAYS(`column_time`) = TO_DAYS(NOW());
-- 方法二:DATE 函數(推薦,可用索引)
SELECT * FROM `table` WHERE DATE(`column_time`) = CURDATE();
SELECT * FROM `table`
WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(`column_time`);
SELECT * FROM `table`
WHERE DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= DATE(`column_time`);
SELECT * FROM `table`
WHERE DATE_SUB(CURDATE(), INTERVAL N DAY) <= DATE(`column_time`);
| 函數 | 說明 | 範例 |
|---|---|---|
NOW() | 當前日期時間 | 2024-01-15 14:30:00 |
CURDATE() | 當前日期 | 2024-01-15 |
CURTIME() | 當前時間 | 14:30:00 |
DATE(expr) | 擷取日期部分 | DATE('2024-01-15 14:30:00') → '2024-01-15' |
DATE_ADD(date, INTERVAL expr unit) | 日期加法 | DATE_ADD(NOW(), INTERVAL 1 DAY) |
DATE_SUB(date, INTERVAL expr unit) | 日期減法 | DATE_SUB(NOW(), INTERVAL 1 MONTH) |
DATEDIFF(d1, d2) | 兩日期天數差 | DATEDIFF('2024-01-15', '2024-01-01') → 14 |
DAYOFWEEK(date) | 星期索引(1=週日) | DAYOFWEEK(NOW()) |
WEEKDAY(date) | 星期索引(0=週一) | WEEKDAY(NOW()) |
WEEK(date[,mode]) | 年份週數 | WEEK(NOW(), 1) (週一為首日) |
MONTH(date) | 月份 | MONTH(NOW()) → 1 |
YEAR(date) | 年份 | YEAR(NOW()) → 2024 |
QUARTER(date) | 季度 | QUARTER(NOW()) → 1 |
DAYNAME(date) | 星期名稱 | DAYNAME(NOW()) → 'Monday' |
MONTHNAME(date) | 月份名稱 | MONTHNAME(NOW()) → 'January' |
LAST_DAY(date) | 該月最後一天 | LAST_DAY(NOW()) → '2024-01-31' |
-- 本週一
SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY);
-- 本週日
SELECT DATE_ADD(CURDATE(), INTERVAL (6 - WEEKDAY(CURDATE())) DAY);
-- 本月第一天
SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01');
-- 本月最後一天
SELECT LAST_DAY(CURDATE());
WHERE DATE(col) = ... 可用索引;WHERE col = DATE(...) 同理WHERE col >= '2024-01-01' AND col < '2024-02-01' 最佳INDEX (column_time, ...) 滿足查詢與排序掌握標準時間範圍查詢模式,能快速實現報表需求,並透過索引友好寫法保證查詢效能。