MySQL TIMESTAMPDIFF() 函數 (計算兩個日期時間的精確間隔)

TIMESTAMPDIFF() 是 MySQL 中用來計算兩個日期時間之間的精確間隔的函數。與 DATEDIFF() 只能計算天數不同,TIMESTAMPDIFF() 可以指定返回的時間單位(年、月、日、小時、分鐘、秒等)。

TIMESTAMPDIFF() 語法 (Syntax)

TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
  • unit:返回值的時間單位。
  • datetime_expr1:開始時間(較早的時間)。
  • datetime_expr2:結束時間(較晚的時間)。
  • 返回值datetime_expr2 - datetime_expr1 的整數差值(以指定的 unit 為單位)。

unit 可用的值

unit說明
MICROSECOND微秒
SECOND
MINUTE分鐘
HOUR小時
DAY
WEEK
MONTH
QUARTER季度
YEAR

TIMESTAMPDIFF() 函數用法範例 (Example)

計算相差幾天

SELECT TIMESTAMPDIFF(DAY, '2024-01-01', '2024-12-31');
-- 結果:365(2024 年是閏年)

SELECT TIMESTAMPDIFF(DAY, '2023-01-01', '2023-12-31');
-- 結果:364(2023 年不是閏年)

計算相差幾個月

SELECT TIMESTAMPDIFF(MONTH, '2024-01-15', '2024-05-15');
-- 結果:4

SELECT TIMESTAMPDIFF(MONTH, '2024-01-31', '2024-02-28');
-- 結果:0(未滿整個月)

SELECT TIMESTAMPDIFF(MONTH, '2024-01-01', '2024-02-01');
-- 結果:1

計算相差幾年

SELECT TIMESTAMPDIFF(YEAR, '2000-06-15', '2024-06-14');
-- 結果:23(未滿 24 年,因為 6/14 還沒到 6/15)

SELECT TIMESTAMPDIFF(YEAR, '2000-06-15', '2024-06-15');
-- 結果:24(剛好 24 年)

計算相差幾小時

SELECT TIMESTAMPDIFF(HOUR, '2024-11-22 08:00:00', '2024-11-22 17:30:00');
-- 結果:9(從 8 點到 17:30 是 9 個完整小時)

SELECT TIMESTAMPDIFF(HOUR, '2024-11-22 08:00:00', '2024-11-23 08:00:00');
-- 結果:24

計算相差幾分鐘

SELECT TIMESTAMPDIFF(MINUTE, '2024-11-22 10:00:00', '2024-11-22 10:45:30');
-- 結果:45(45 分 30 秒,取整數部分)

SELECT TIMESTAMPDIFF(MINUTE, '2024-01-01 00:00:00', '2024-01-01 23:59:59');
-- 結果:1439(一天有 1440 分鐘,這裡是 23:59:59)

計算相差幾秒

SELECT TIMESTAMPDIFF(SECOND, '2024-11-22 10:00:00', '2024-11-22 10:01:30');
-- 結果:90

實際應用範例

計算精確年齡

SELECT 
    name,
    birthday,
    TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age
FROM users;
namebirthdayage
張三1990-05-1534
李四2000-12-0123

計算服務時長(年資)

SELECT 
    employee_name,
    hire_date,
    TIMESTAMPDIFF(YEAR, hire_date, CURDATE()) AS years_of_service,
    TIMESTAMPDIFF(MONTH, hire_date, CURDATE()) AS months_of_service
FROM employees;

計算訂單處理時間

SELECT 
    order_id,
    created_at,
    completed_at,
    TIMESTAMPDIFF(HOUR, created_at, completed_at) AS hours_to_complete
FROM orders
WHERE completed_at IS NOT NULL;

計算會員資格剩餘時間

SELECT 
    user_id,
    membership_end,
    TIMESTAMPDIFF(DAY, NOW(), membership_end) AS days_remaining,
    TIMESTAMPDIFF(HOUR, NOW(), membership_end) AS hours_remaining
FROM memberships
WHERE membership_end > NOW();

篩選最近 N 小時內的記錄

-- 取得最近 24 小時內的活動記錄
SELECT * FROM activity_logs
WHERE TIMESTAMPDIFF(HOUR, created_at, NOW()) <= 24;

-- 或使用更有效率的方式
SELECT * FROM activity_logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR);

計算回應時間的統計

SELECT 
    AVG(TIMESTAMPDIFF(MINUTE, created_at, first_response_at)) AS avg_response_minutes,
    MIN(TIMESTAMPDIFF(MINUTE, created_at, first_response_at)) AS min_response_minutes,
    MAX(TIMESTAMPDIFF(MINUTE, created_at, first_response_at)) AS max_response_minutes
FROM support_tickets
WHERE first_response_at IS NOT NULL;

TIMESTAMPDIFF() 與 DATEDIFF() 的比較

特性TIMESTAMPDIFF()DATEDIFF()
參數順序(unit, start, end)(end, start)
時間單位可指定(年、月、日、時等)只有天
時間部分會考慮會忽略
計算方向end - startend - start
-- 注意:參數順序不同!
SELECT DATEDIFF('2024-12-31', '2024-01-01');
-- 結果:365

SELECT TIMESTAMPDIFF(DAY, '2024-01-01', '2024-12-31');
-- 結果:365

注意事項

  • TIMESTAMPDIFF() 返回的是整數,會捨棄小數部分。
  • 參數順序是 (unit, start, end),計算 end - start,與 DATEDIFF(end, start) 的參數順序相反。
  • 如果 datetime_expr1 晚於 datetime_expr2,返回負數。
  • 如果任一參數為 NULL,結果也是 NULL

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