首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 時間範圍查詢實戰:今日、本週、本月、近 30 天資料篩選

     編輯:MySQL 資料庫相關知識

業務報表常需按時間維度篩選資料。本文整理 MySQL 常用時間範圍查詢模式,並附核心日期函數速查表。

常用時間範圍查詢模式

今日資料

-- 方法一:TO_DAYS 比對
SELECT * FROM `table` WHERE TO_DAYS(`column_time`) = TO_DAYS(NOW());

-- 方法二:DATE 函數(推薦,可用索引)
SELECT * FROM `table` WHERE DATE(`column_time`) = CURDATE();

本週資料(近 7 天)

SELECT * FROM `table` 
WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(`column_time`);

本月資料(近 30 天)

SELECT * FROM `table` 
WHERE DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= DATE(`column_time`);

通用:近 N 天

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());

效能建議

  1. 避免函數包裹欄位:WHERE DATE(col) = ... 可用索引;WHERE col = DATE(...) 同理
  2. 範圍查詢優於函數:WHERE col >= '2024-01-01' AND col < '2024-02-01' 最佳
  3. 分區表:大表按時間分區,配合分區裁剪
  4. 覆蓋索引:INDEX (column_time, ...) 滿足查詢與排序

掌握標準時間範圍查詢模式,能快速實現報表需求,並透過索引友好寫法保證查詢效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved