在業務開發中,按時間範圍查詢資料是高頻需求。本文整理了 MySQL 中最常用的 12 種時間範圍查詢語句,涵蓋當天、昨天、近 N 天、本週/上週、本月/上月、季度、年度等場景,並附上核心日期函數參考表,方便開發者快速查閱與複製使用。
| 函數 | 說明 | 範例結果 |
|---|---|---|
NOW() | 當前日期時間 | 2024-01-15 14:30:00 |
CURDATE() | 當前日期 | 2024-01-15 |
CURTIME() | 當前時間 | 14:30:00 |
TO_DAYS(date) | 日期轉天數(從年 0 開始) | 738500 |
DATE_SUB(date, INTERVAL) | 日期減法運算 | DATE_SUB(NOW(), INTERVAL 7 DAY) |
QUARTER(date) | 返回季度(1-4) | 1 |
YEAR(date) | 返回年份 | 2024 |
YEARWEEK(date) | 返回年週 | 202403 |
DATE_FORMAT(date, format) | 日期格式化 | DATE_FORMAT(NOW(), '%Y-%m') |
-- 方式一:TO_DAYS 比較(推薦,可用索引)
SELECT * FROM `table` WHERE TO_DAYS(`time_col`) = TO_DAYS(NOW());
-- 方式二:DATE 比較
SELECT * FROM `table` WHERE DATE(`time_col`) = CURDATE();
SELECT * FROM `table` WHERE TO_DAYS(NOW()) - TO_DAYS(`time_col`) = 1;
-- 方式一:DATE_SUB + 比較
SELECT * FROM `table` WHERE `time_col` >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
-- 方式二:DATE_SUB 在左側(同樣可用索引)
SELECT * FROM `table` WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(`time_col`);
SELECT * FROM `table` WHERE `time_col` >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH);
SELECT * FROM `table` WHERE QUARTER(`time_col`) = QUARTER(NOW());
SELECT * FROM `table` WHERE QUARTER(`time_col`) = QUARTER(DATE_SUB(NOW(), INTERVAL 1 QUARTER));
SELECT * FROM `table` WHERE YEAR(`time_col`) = YEAR(NOW());
SELECT * FROM `table` WHERE YEAR(`time_col`) = YEAR(DATE_SUB(NOW(), INTERVAL 1 YEAR));
SELECT name, `time_col` FROM `table`
WHERE YEARWEEK(DATE_FORMAT(`time_col`, '%Y-%m-%d')) = YEARWEEK(NOW());
SELECT name, `time_col` FROM `table`
WHERE YEARWEEK(DATE_FORMAT(`time_col`, '%Y-%m-%d')) = YEARWEEK(NOW()) - 1;
SELECT name, `time_col` FROM `table`
WHERE DATE_FORMAT(`time_col`, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m');
SELECT name, `time_col` FROM `table`
WHERE DATE_FORMAT(`time_col`, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m');
⚠️ 避免在欄位上使用函數
WHERE DATE(`time_col`) = CURDATE()會導致索引失效,全表掃描。✅ 推薦:將計算移到常數側
WHERE `time_col` >= '2024-01-15 00:00:00' AND `time_col` < '2024-01-16 00:00:00'
或使用WHERE `time_col` >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)(MySQL 5.6+ 可用索引)
| 函數 | 說明 | 範例 |
|---|---|---|
| DAYOFWEEK(date) | 星期幾 (1=週日...7=週六) | DAYOFWEEK('2024-01-15') → 2 |
| WEEKDAY(date) | 星期幾 (0=週一...6=週日) | WEEKDAY('2024-01-15') → 0 |
| DAYOFMONTH(date) | 月份中的第幾天 (1-31) | DAYOFMONTH('2024-01-15') → 15 |
| DAYOFYEAR(date) | 年份中的第幾天 (1-366) | DAYOFYEAR('2024-01-15') → 15 |
| MONTH(date) | 月份數值 (1-12) | MONTH('2024-01-15') → 1 |
| DAYNAME(date) | 星期名稱 | DAYNAME('2024-01-15') → 'Monday' |
| MONTHNAME(date) | 月份名稱 | MONTHNAME('2024-01-15') → 'January' |
| LAST_DAY(date) | 該月最後一天 | LAST_DAY('2024-01-15') → '2024-01-31' |
DATETIME 或 TIMESTAMP 型別,並建立索引>= 和 <)而非函數轉換