萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 日期範圍查詢全攻略:當日、本週、本月資料的高效 SQL 寫法

實作報表或後台統計時,常需要「查詢今天、這一週、這一個月」的資料。本文整理 MySQL 日期查詢的常用寫法,並說明為何建議避免在欄位上使用函數,以利用索引提升效能。

基礎觀念:日期比較的邊界條件

假設欄位 birthday 為 DATE 或 DATETIME 型別:

  • birthday > '2009-02-03':大於該日(不含當日)
  • birthday >= '2009-02-03':大於等於該日(含當日)
  • birthday < '2009-02-04':小於隔日 00:00:00(等同含當日全天)

關鍵原則:盡量用「開區間」WHERE col >= 'start' AND col < 'end',避免對欄位使用 DATE()、TO_DAYS() 等函數,導致索引失效。

常用相對時間查詢(可用索引的寫法)

查詢今天

-- 利用 CURDATE() 取得當天日期,配合開區間
SELECT * FROM `orders`
WHERE `create_time` >= CURDATE()
  AND `create_time` < CURDATE() + INTERVAL 1 DAY;

查詢最近 7 天(含今天)

SELECT * FROM `orders`
WHERE `create_time` >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
  AND `create_time` < CURDATE() + INTERVAL 1 DAY;

查詢本月

SELECT * FROM `orders`
WHERE `create_time` >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
  AND `create_time` < DATE_FORMAT(CURDATE(), '%Y-%m-01') + INTERVAL 1 MONTH;

查詢上個月

SELECT * FROM `orders`
WHERE `create_time` >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01')
  AND `create_time` < DATE_FORMAT(CURDATE(), '%Y-%m-01');

Unix Timestamp 轉換函數速查

函數說明範例
UNIX_TIMESTAMP()目前時間轉 Unix 秒數SELECT UNIX_TIMESTAMP();
UNIX_TIMESTAMP('2023-01-01 12:00:00')指定日期時間轉 Unix 秒數SELECT UNIX_TIMESTAMP('2023-01-01 12:00:00');
FROM_UNIXTIME(1672574400)Unix 秒數轉 YYYY-MM-DD HH:MM:SSSELECT FROM_UNIXTIME(1672574400);
FROM_UNIXTIME(ts, '%Y-%m-%d')自訂格式輸出SELECT FROM_UNIXTIME(ts, '%Y-%m-%d');

效能提醒

  • 避免 WHERE DATE(create_time) = CURDATE() —— 會導致全表掃描
  • 建議 在 create_time 建立索引,配合開區間查詢
  • 大量資料分頁時,參考「延遲關聯」或「游標分頁」優化

掌握這些模式,即可輕鬆應對各類時間維度的統計需求。

copyright © 萬盛學電腦網 all rights reserved