首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 時間範圍查詢完全指南:當天、昨天、近 7/30 天、季度、年度等常用 SQL 範例

     編輯:MySQL 綜合教學

MySQL 時間範圍查詢完全指南:當天、昨天、近 7/30 天、季度、年度等常用 SQL 範例

在業務開發中,按時間範圍查詢資料是高頻需求。本文整理了 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')

二、12 種常用時間範圍查詢語句

1. 查詢當天資料

-- 方式一:TO_DAYS 比較(推薦,可用索引)
SELECT * FROM `table` WHERE TO_DAYS(`time_col`) = TO_DAYS(NOW());

-- 方式二:DATE 比較
SELECT * FROM `table` WHERE DATE(`time_col`) = CURDATE();

2. 查詢昨天資料

SELECT * FROM `table` WHERE TO_DAYS(NOW()) - TO_DAYS(`time_col`) = 1;

3. 查詢近 7 天資料(含今天)

-- 方式一: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`);

4. 查詢近 30 天資料(含今天)

SELECT * FROM `table` WHERE `time_col` >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH);

5. 查詢本季度資料

SELECT * FROM `table` WHERE QUARTER(`time_col`) = QUARTER(NOW());

6. 查詢上季度資料

SELECT * FROM `table` WHERE QUARTER(`time_col`) = QUARTER(DATE_SUB(NOW(), INTERVAL 1 QUARTER));

7. 查詢本年度資料

SELECT * FROM `table` WHERE YEAR(`time_col`) = YEAR(NOW());

8. 查詢去年資料

SELECT * FROM `table` WHERE YEAR(`time_col`) = YEAR(DATE_SUB(NOW(), INTERVAL 1 YEAR));

9. 查詢本週資料(週日為週首)

SELECT name, `time_col` FROM `table` 
WHERE YEARWEEK(DATE_FORMAT(`time_col`, '%Y-%m-%d')) = YEARWEEK(NOW());

10. 查詢上週資料

SELECT name, `time_col` FROM `table` 
WHERE YEARWEEK(DATE_FORMAT(`time_col`, '%Y-%m-%d')) = YEARWEEK(NOW()) - 1;

11. 查詢本月資料

SELECT name, `time_col` FROM `table` 
WHERE DATE_FORMAT(`time_col`, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m');

12. 查詢上月資料

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 型別,並建立索引
  • 大量資料查詢時,優先使用範圍查詢(>= 和 <)而非函數轉換
  • 分頁查詢大時間範圍資料時,考慮使用游標分頁(ID 基準)而非 OFFSET
  • 跨時區業務統一儲存 UTC 時間,應用層轉換顯示
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved