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

MySQL 相對時間區間查詢:本週、上月、近 6 個月寫法大全

     編輯:MySQL 綜合教學

核心原則:避免在欄位上用函數,改用範圍查詢利用索引

假設 submittime DATETIME 有索引。

常用範本

-- 本週 (以 Monday 為週首)
WHERE submittime >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
  AND submittime <  DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) + INTERVAL 7 DAY

-- 上週
WHERE submittime >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) + 7 DAY)
  AND submittime <  DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)

-- 本月
WHERE submittime >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
  AND submittime <  DATE_FORMAT(CURDATE(), '%Y-%m-01') + INTERVAL 1 MONTH

-- 上月
WHERE submittime >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01')
  AND submittime <  DATE_FORMAT(CURDATE(), '%Y-%m-01')

-- 近 6 個月 (含今天)
WHERE submittime >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
  AND submittime <  CURDATE() + INTERVAL 1 DAY

若欄位為 Unix 時間戳 (INT)

-- 本月
WHERE `ts` >= UNIX_TIMESTAMP(DATE_FORMAT(CURDATE(), '%Y-%m-01'))
  AND `ts` <  UNIX_TIMESTAMP(DATE_FORMAT(CURDATE(), '%Y-%m-01') + INTERVAL 1 MONTH)

效能對比

寫法能否用索引備註
DATE_FORMAT(col) = ...❌函數導致全掃
YEARWEEK(col) = YEARWEEK(NOW())❌同上
col BETWEEN 起始 AND 結束✅範圍查詢,SARGable

永遠優先用 col >= 起始 AND col < 結束 模式。

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