DATE_ADD(date, INTERVAL expr unit)
DATE_SUB(date, INTERVAL expr unit)
-- date: DATE/DATETIME/TIMESTAMP 起始值
-- expr: 間隔值(可為負數,單一單位時)
-- unit: 單位關鍵字(不分大小寫)
| 單位 | 含義 | expr 格式 |
|---|---|---|
| MICROSECOND | 微秒 | 整數 |
| SECOND | 秒 | 整數 |
| MINUTE | 分 | 整數 |
| HOUR | 時 | 整數 |
| DAY | 天 | 整數 |
| WEEK | 週 | 整數 |
| MONTH | 月 | 整數 |
| QUARTER | 季 | 整數 |
| YEAR | 年 | 整數 |
| SECOND_MICROSECOND | 秒.微秒 | '秒.微秒' |
| MINUTE_MICROSECOND | 分.微秒 | '分.微秒' |
| MINUTE_SECOND | 分:秒 | '分:秒' |
| HOUR_MICROSECOND | 時.微秒 | '時.微秒' |
| HOUR_SECOND | 時:分:秒 | '時:分:秒' |
| HOUR_MINUTE | 時:分 | '時:分' |
| DAY_MICROSECOND | 天.微秒 | '天.微秒' |
| DAY_SECOND | 天 時:分:秒 | '天 時:分:秒' |
| DAY_MINUTE | 天 時:分 | '天 時:分' |
| DAY_HOUR | 天 時 | '天 時' |
| YEAR_MONTH | 年-月 | '年-月' |
SELECT DATE_ADD('2024-01-18', INTERVAL '1 2' YEAR_MONTH); -- 2025-03-18
SELECT DATE_ADD('2024-01-18', INTERVAL '1-2' YEAR_MONTH); -- 2025-03-18
SELECT DATE_ADD('2024-01-18', INTERVAL '1,2' YEAR_MONTH); -- 2025-03-18
-- 單一數值視為最小單位(月)
SELECT DATE_ADD('2024-01-18', INTERVAL 1 YEAR_MONTH); -- 2024-02-18
-- 負數僅支援單一單位
SELECT DATE_ADD('2024-01-18', INTERVAL -1 YEAR_MONTH); -- 2023-12-18
-- 30 天前
SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 本月第一天 00:00:00
SELECT DATE_FORMAT(NOW(), '%Y-%m-01 00:00:00');
-- 或
SELECT DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 1 DAY);
-- 下個月同一天(處理月底邊界)
SELECT DATE_ADD('2024-01-31', INTERVAL 1 MONTH); -- 2024-02-29 (閏年) / 2024-02-28
-- 精確到毫秒
SELECT DATE_ADD(NOW(), INTERVAL '1.500' SECOND_MICROSECOND);
WHERE DATE_ADD(created, INTERVAL 1 DAY) > NOW())會導致索引失效,改寫為 WHERE created > DATE_SUB(NOW(), INTERVAL 1 DAY)。