首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MySQL 查詢近三個月且狀態為 2 或 5 的運單數據

     編輯:程式設計綜合問答

標準 SQL 寫法

SELECT *
FROM oal_tb_waybill
WHERE state IN (2, 5)
  AND create_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH);

關鍵點解析

  1. DATE_SUB(NOW(), INTERVAL 3 MONTH):動態計算「3個月前」,無需硬編碼日期
  2. IN (2, 5):簡潔替代 `state = 2 OR state = 5`
  3. 若 `create_time` 有索引,此寫法可用索引範圍掃描

進階優化版本

1. 避免 NOW() 導致查詢緩存失效(MySQL 5.7+)

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);

2. 明確列出欄位而非 SELECT *

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);

3. 分頁查詢(大數據量)

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 個月寫法
PostgreSQLcreate_time >= NOW() - INTERVAL '3 months'
SQL Servercreate_time >= DATEADD(MONTH, -3, GETDATE())
Oraclecreate_time >= SYSDATE - INTERVAL '3' MONTH
SQLitecreate_time >= date('now', '-3 months')

總結

MySQL 中使用 `DATE_SUB(NOW(), INTERVAL 3 MONTH)` 結合 `IN` 條件即可高效完成需求。注意索引設計與避免 `SELECT *` 以獲得最佳效能。

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