MySQL DATE_ADD() 函數 (在日期上增加時間間隔)
DATE_ADD() 是 MySQL 中用來在日期時間值上增加指定時間間隔的函數。它可以增加天、月、年、小時、分鐘、秒等各種時間單位。
如果需要減去時間間隔,可以使用 DATE_SUB() 函數,或者在 DATE_ADD() 中使用負數。
DATE_ADD() 語法 (Syntax)
DATE_ADD(date, INTERVAL expr unit)
- date:起始日期或日期時間。
- expr:要增加的時間間隔數量(正數表示增加,負數表示減少)。
- unit:時間間隔的單位。
unit 可用的值
| unit | expr 格式 | 說明 |
|---|---|---|
| MICROSECOND | MICROSECONDS | 微秒 |
| SECOND | SECONDS | 秒 |
| MINUTE | MINUTES | 分鐘 |
| HOUR | HOURS | 小時 |
| DAY | DAYS | 天 |
| WEEK | WEEKS | 週 |
| MONTH | MONTHS | 月 |
| QUARTER | QUARTERS | 季度 |
| YEAR | YEARS | 年 |
| SECOND_MICROSECOND | 'SECONDS.MICROSECONDS' | 秒和微秒 |
| MINUTE_MICROSECOND | 'MINUTES:SECONDS.MICRO' | 分、秒和微秒 |
| MINUTE_SECOND | 'MINUTES:SECONDS' | 分和秒 |
| HOUR_MICROSECOND | 'HOURS:MINUTES:SECONDS.MICRO' | 時、分、秒和微秒 |
| HOUR_SECOND | 'HOURS:MINUTES:SECONDS' | 時、分和秒 |
| HOUR_MINUTE | 'HOURS:MINUTES' | 時和分 |
| DAY_MICROSECOND | 'DAYS HOURS:MINUTES:SECONDS.MICRO' | 日、時、分、秒和微秒 |
| DAY_SECOND | 'DAYS HOURS:MINUTES:SECONDS' | 日、時、分和秒 |
| DAY_MINUTE | 'DAYS HOURS:MINUTES' | 日、時和分 |
| DAY_HOUR | 'DAYS HOURS' | 日和時 |
| YEAR_MONTH | 'YEARS-MONTHS' | 年和月 |
DATE_ADD() 函數用法範例 (Example)
增加天數
SELECT DATE_ADD('2024-05-01', INTERVAL 1 DAY);
-- 結果:2024-05-02
SELECT DATE_ADD('2024-12-31', INTERVAL 1 DAY);
-- 結果:2025-01-01(自動跨年)
SELECT DATE_ADD('2024-12-31 23:59:59', INTERVAL 1 DAY);
-- 結果:2025-01-01 23:59:59
增加週數
SELECT DATE_ADD('2024-11-22', INTERVAL 1 WEEK);
-- 結果:2024-11-29
SELECT DATE_ADD('2024-11-22', INTERVAL 2 WEEK);
-- 結果:2024-12-06
增加月份
SELECT DATE_ADD('2024-05-01', INTERVAL 1 MONTH);
-- 結果:2024-06-01
SELECT DATE_ADD('2024-01-31', INTERVAL 1 MONTH);
-- 結果:2024-02-29(2024 年是閏年,會自動調整為該月的最後一天)
SELECT DATE_ADD('2023-01-31', INTERVAL 1 MONTH);
-- 結果:2023-02-28(2023 年不是閏年)
增加年份
SELECT DATE_ADD('2024-05-01', INTERVAL 1 YEAR);
-- 結果:2025-05-01
SELECT DATE_ADD('2024-02-29', INTERVAL 1 YEAR);
-- 結果:2025-02-28(2025 年不是閏年,自動調整)
增加小時
SELECT DATE_ADD('2024-12-31 23:00:00', INTERVAL 2 HOUR);
-- 結果:2025-01-01 01:00:00
增加分鐘和秒
SELECT DATE_ADD('2024-05-01 10:30:00', INTERVAL 30 MINUTE);
-- 結果:2024-05-01 11:00:00
SELECT DATE_ADD('2024-12-31 23:59:59', INTERVAL 1 SECOND);
-- 結果:2025-01-01 00:00:00
使用負數減少時間
SELECT DATE_ADD('2024-05-01', INTERVAL -1 DAY);
-- 結果:2024-04-30
SELECT DATE_ADD('2024-05-01', INTERVAL -1 YEAR);
-- 結果:2023-05-01
複合時間間隔
-- 增加 1 年 3 個月
SELECT DATE_ADD('2024-05-01', INTERVAL '1-3' YEAR_MONTH);
-- 結果:2025-08-01
-- 增加 2 天 3 小時
SELECT DATE_ADD('2024-05-01 10:00:00', INTERVAL '2 3' DAY_HOUR);
-- 結果:2024-05-03 13:00:00
實際應用範例
計算訂閱到期日
SELECT
user_id,
subscription_start,
DATE_ADD(subscription_start, INTERVAL 1 MONTH) AS expiry_date
FROM subscriptions;
計算預計送達日期
SELECT
order_id,
order_date,
DATE_ADD(order_date, INTERVAL 3 DAY) AS estimated_delivery
FROM orders;
篩選即將到期的記錄
-- 找出 7 天內即將到期的訂閱
SELECT * FROM subscriptions
WHERE expiry_date BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 7 DAY);
自動更新資料
-- 將所有訂閱延長一個月
UPDATE subscriptions
SET expiry_date = DATE_ADD(expiry_date, INTERVAL 1 MONTH)
WHERE status = 'active';
DATE_ADD() 與 + INTERVAL 的比較
MySQL 也支援使用 + 運算子直接加上 INTERVAL:
-- 以下兩種寫法結果相同
SELECT DATE_ADD('2024-05-01', INTERVAL 1 DAY);
SELECT '2024-05-01' + INTERVAL 1 DAY;
-- 結果都是:2024-05-02