MySQL DATEDIFF() 函數 (計算兩個日期之間相差的天數)

DATEDIFF() 是 MySQL 中用來計算兩個日期之間相差天數的函數。它只考慮日期部分,時間部分會被忽略。

如果需要計算更精確的時間差(如小時、分鐘),請使用 TIMESTAMPDIFF() 函數。

DATEDIFF() 語法 (Syntax)

DATEDIFF(date1, date2)
  • date1:被減數(較後的日期)。
  • date2:減數(較前的日期)。
  • 返回值:date1 - date2 的天數差。如果 date1 晚於 date2,返回正數;如果 date1 早於 date2,返回負數。

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

基本用法

SELECT DATEDIFF('2024-12-31', '2024-12-25');
-- 結果:6(12/31 比 12/25 晚 6 天)

SELECT DATEDIFF('2024-01-01', '2024-12-31');
-- 結果:-365(2024/1/1 比 2024/12/31 早 365 天)

SELECT DATEDIFF('2024-05-01', '2024-05-01');
-- 結果:0(同一天)

時間部分會被忽略

SELECT DATEDIFF('2024-12-31 23:59:59', '2024-12-30 00:00:01');
-- 結果:1(只計算日期差,時間被忽略)

SELECT DATEDIFF('2024-12-31 00:00:01', '2024-12-30 23:59:59');
-- 結果:1(即使時間只差 2 秒,日期差仍為 1 天)

與 NOW() 或 CURDATE() 搭配使用

-- 計算距離今天已過了幾天
SELECT DATEDIFF(NOW(), '2024-01-01') AS days_since_new_year;

-- 計算距離某個日期還有幾天
SELECT DATEDIFF('2024-12-31', CURDATE()) AS days_until_year_end;

實際應用範例

計算訂單已處理天數

SELECT 
    order_id,
    order_date,
    DATEDIFF(NOW(), order_date) AS days_since_order
FROM orders;
order_idorder_datedays_since_order
12024-11-157
22024-11-202
32024-11-220

計算會員資格剩餘天數

SELECT 
    user_id,
    membership_end_date,
    DATEDIFF(membership_end_date, CURDATE()) AS days_remaining
FROM members
WHERE membership_end_date >= CURDATE();

篩選逾期訂單

-- 找出超過 30 天未處理的訂單
SELECT * FROM orders
WHERE status = 'pending'
  AND DATEDIFF(NOW(), order_date) > 30;

計算平均處理時間

SELECT 
    AVG(DATEDIFF(completed_date, created_date)) AS avg_processing_days
FROM tickets
WHERE status = 'completed';

按天數區間統計

SELECT 
    CASE 
        WHEN DATEDIFF(NOW(), order_date) <= 7 THEN '7天內'
        WHEN DATEDIFF(NOW(), order_date) <= 30 THEN '7-30天'
        WHEN DATEDIFF(NOW(), order_date) <= 90 THEN '30-90天'
        ELSE '90天以上'
    END AS order_age,
    COUNT(*) AS order_count
FROM orders
GROUP BY 
    CASE 
        WHEN DATEDIFF(NOW(), order_date) <= 7 THEN '7天內'
        WHEN DATEDIFF(NOW(), order_date) <= 30 THEN '7-30天'
        WHEN DATEDIFF(NOW(), order_date) <= 90 THEN '30-90天'
        ELSE '90天以上'
    END;

計算用戶註冊天數

SELECT 
    username,
    registration_date,
    DATEDIFF(CURDATE(), registration_date) AS member_days
FROM users
ORDER BY member_days DESC;

DATEDIFF() 與 TIMESTAMPDIFF() 的比較

函數功能精度時間是否考慮
DATEDIFF()計算日期差
TIMESTAMPDIFF()計算日期時間差可指定
-- DATEDIFF() 只看日期
SELECT DATEDIFF('2024-12-31 23:59:59', '2024-12-31 00:00:01');
-- 結果:0(同一天)

-- TIMESTAMPDIFF() 可以計算精確的時間差
SELECT TIMESTAMPDIFF(HOUR, '2024-12-31 00:00:01', '2024-12-31 23:59:59');
-- 結果:23(相差約 23 小時)

注意事項

  • DATEDIFF() 的參數順序是 (date1, date2),計算 date1 - date2。注意不要搞混順序。
  • 如果任一參數為 NULL,結果也是 NULL
  • 返回值是整數,不會有小數部分。

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