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

MySQL 日期區間查詢完全指南:BETWEEN、月份篩選與效能優化

     編輯:MySQL 資料庫相關知識

資料庫開發中,依日期區間篩選資料是極高頻需求。本文整理 MySQL 日期查詢的標準寫法、進階技巧與效能陷阱,助您撰寫既正確又高效的 SQL。

基礎區間查詢:標準寫法

查詢 cangku 表中 shijian 欄位落於 2011-01-13 至 2011-01-20 之間的記錄:

SELECT * FROM `cangku` 
WHERE `shijian` >= '2011-01-13' AND `shijian` <= '2011-01-20';

推薦改用 BETWEEN: 可讀性更佳,且包含邊界值。

SELECT * FROM `cangku` 
WHERE `shijian` BETWEEN '2011-01-13' AND '2011-01-20';

進階技巧:相對時間與月份篩選

查詢「本月」資料

SELECT * FROM `tables` 
WHERE MONTH(`Date`) = MONTH(NOW()) 
  AND YEAR(`Date`) = YEAR(NOW());

效能警示: 對欄位使用函數(MONTH()、YEAR())會導致索引失效(全表掃描)。大量資料時請改用區間查詢:

SELECT * FROM `tables`
WHERE `Date` >= DATE_FORMAT(NOW(), '%Y-%m-01')
  AND `Date` < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH);

查詢「最近 30 天」資料

SELECT * FROM `orders`
WHERE `created_at` >= DATE_SUB(NOW(), INTERVAL 30 DAY);

日期時間型別與時區陷阱

型別儲存範圍時區處理適用場景
DATETIME1000-01-01 ~ 9999-12-31不轉換,原樣儲存固定時區應用、歷史資料
TIMESTAMP1970-01-01 ~ 2038-01-19寫入轉 UTC,讀出轉回 session 時區跨時區應用、自動記錄建立/更新時間
DATE1000-01-01 ~ 9999-12-31無時區概念僅需日期(生日、截止日)

索引優化關鍵原則

  1. 避免對索引欄位使用函數/運算: WHERE DATE(created_at) = '2023-01-01' ❌ → WHERE created_at >= '2023-01-01' AND created_at < '2023-01-02' ✅
  2. 建立複合索引時將日期欄位置於左側: INDEX idx_user_date (user_id, created_at) 可同時支援「某用戶某期間」查詢。
  3. 分區表: 億級資料量可考慮 RANGE COLUMNS(created_at) 分區,實現分區裁剪。

實用片段速查表

需求SQL 片段
今日資料WHERE `dt` >= CURDATE()
本週資料(週一起)WHERE `dt` >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
本季資料WHERE QUARTER(`dt`) = QUARTER(NOW()) AND YEAR(`dt`) = YEAR(NOW())
跨年週期(如 12/25 ~ 01/05)WHERE (`dt` >= '2023-12-25' AND `dt` < '2024-01-06')

掌握日期查詢的核心在於:「用區間替代函數、善用索引、注意時區」。將這些原則內化為編碼習慣,查詢效能與正確性將雙雙提升。

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