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_id | order_date | days_since_order |
|---|---|---|
| 1 | 2024-11-15 | 7 |
| 2 | 2024-11-20 | 2 |
| 3 | 2024-11-22 | 0 |
計算會員資格剩餘天數
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。 - 返回值是整數,不會有小數部分。