業務場景
資料表中 create_date 以字串格式(如 '2014-06-18 10:20:29')儲存,需找出「建立時間 + 10 分鐘 ≥ 指定時間」的記錄。
核心 SQL
SELECT id
FROM tran
WHERE state = 'F'
AND TIMESTAMPDIFF(SECOND,
DATE_ADD(create_date, INTERVAL 10 MINUTE),
'2014-06-18 10:30:29') > 0;
函數解析
| 函數 | 作用 |
DATE_ADD(date, INTERVAL expr unit) | 日期加減運算,支援 MINUTE、HOUR、DAY 等單位 |
TIMESTAMPDIFF(unit, datetime1, datetime2) | 回傳 datetime2 - datetime1 的差值(指定單位) |
邏輯拆解
DATE_ADD(create_date, INTERVAL 10 MINUTE):計算「建立時間 + 10 分鐘」
TIMESTAMPDIFF(SECOND, ..., '2014-06-18 10:30:29'):以秒為單位計算「目標時間 - 計算後時間」
> 0:表示目標時間晚於「建立時間 + 10 分鐘」,即尚未超過 10 分鐘閾值
等效寫法(更直觀)
-- 寫法 1:直接比較日期時間
WHERE DATE_ADD(create_date, INTERVAL 10 MINUTE) <= '2014-06-18 10:30:29'
-- 寫法 2:使用 DATE_SUB 反向思考
WHERE create_date <= DATE_SUB('2014-06-18 10:30:29', INTERVAL 10 MINUTE)
效能建議
- 若
create_date 有索引,寫法 2 可用上索引(create_date 孤立在左側)
- 字串日期隱含轉換開銷,建議欄位型別改為
DATETIME 或 TIMESTAMP
- 避免在 WHERE 條件中對欄位做運算(如
YEAR(date) = 2014),導致全表掃描
常見陷阱
| 錯誤寫法 | 問題 | 修正 |
DATE_ADD(create_date, INTERVAL 10 DAY_MINUTE) | 單位關鍵字錯誤 | INTERVAL 10 MINUTE |
TIMESTAMPDIFF(MINUTE, ...) > 10 | 單位不匹配邏輯 | 統一用 SECOND 或調整比較值 |
| 字串直接比較 | 格式不固定會錯 | 先轉型或用 STR_TO_DATE |