MySQL DATE_ADD() 函數 (在日期上增加時間間隔)

DATE_ADD() 是 MySQL 中用來在日期時間值上增加指定時間間隔的函數。它可以增加天、月、年、小時、分鐘、秒等各種時間單位。

如果需要減去時間間隔,可以使用 DATE_SUB() 函數,或者在 DATE_ADD() 中使用負數。

DATE_ADD() 語法 (Syntax)

DATE_ADD(date, INTERVAL expr unit)
  • date:起始日期或日期時間。
  • expr:要增加的時間間隔數量(正數表示增加,負數表示減少)。
  • unit:時間間隔的單位。

unit 可用的值

unitexpr 格式說明
MICROSECONDMICROSECONDS微秒
SECONDSECONDS
MINUTEMINUTES分鐘
HOURHOURS小時
DAYDAYS
WEEKWEEKS
MONTHMONTHS
QUARTERQUARTERS季度
YEARYEARS
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

更多 MySQL 相關的日期時間函數在這邊
更多 SQL Server 相關的日期時間函數在這邊