SELECT *
FROM oal_tb_waybill
WHERE state IN (2, 5)
AND create_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH);
DATE_SUB(NOW(), INTERVAL 3 MONTH):動態計算「3個月前」,無需硬編碼日期IN (2, 5):簡潔替代 `state = 2 OR state = 5`SELECT *
FROM oal_tb_waybill
WHERE state IN (2, 5)
AND create_time >= DATE_SUB((SELECT MAX(create_time) FROM oal_tb_waybill), INTERVAL 3 MONTH);
SELECT waybill_id, sender, receiver, create_time, state, amount
FROM oal_tb_waybill
WHERE state IN (2, 5)
AND create_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH);
SELECT *
FROM oal_tb_waybill
WHERE state IN (2, 5)
AND create_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH)
ORDER BY create_time DESC
LIMIT 100 OFFSET 0;
-- 組合索引:狀態優先(基數低)+ 時間(範圍查詢)
CREATE INDEX idx_state_create_time ON oal_tb_waybill(state, create_time);
-- 或覆蓋索引(若查詢欄位固定)
CREATE INDEX idx_cover ON oal_tb_waybill(state, create_time)
INCLUDE (waybill_id, sender, receiver, amount);
| 數據庫 | 近 3 個月寫法 |
|---|---|
| PostgreSQL | create_time >= NOW() - INTERVAL '3 months' |
| SQL Server | create_time >= DATEADD(MONTH, -3, GETDATE()) |
| Oracle | create_time >= SYSDATE - INTERVAL '3' MONTH |
| SQLite | create_time >= date('now', '-3 months') |
MySQL 中使用 `DATE_SUB(NOW(), INTERVAL 3 MONTH)` 結合 `IN` 條件即可高效完成需求。注意索引設計與避免 `SELECT *` 以獲得最佳效能。