假設 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
-- 本月
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 < 結束 模式。