三种计算日期的函数
函数 | 用途 | 示例 |
---|---|---|
DATEDIFF() | 计算两个日期的天数差 | DATEDIFF('2023-10-05', '2023-10-01') → 4 |
TIMESTAMPDIFF() | 按指定单位(年、月、小时等)计算差 | TIMESTAMPDIFF(MONTH, '2023-01-01', '2023-03-01') → 2 |
DATE_ADD() | 日期加法 | DATE_ADD('2023-10-01', INTERVAL 7 DAY) → '2023-10-08' |
常用的是:DATEDIFF()其
基本语法
sql
DATEDIFF(end_date, start_date)
- 参数:
end_date
:结束日期(将被减数)。start_date
:开始日期(减数)。
- 返回值:
end_date - start_date
的天数差(整数)。- 若
end_date
早于start_date
,返回负数。
- 若
示例场景
示例 1:基本计算
sql
SELECT
DATEDIFF('2023-10-05', '2023-10-01') AS diff_1, -- 输出:4
DATEDIFF('2023-10-01', '2023-10-05') AS diff_2; -- 输出:-4
示例 2:结合表字段
sql
-- 计算订单下单日期与发货日期的间隔
SELECT
order_id,
DATEDIFF(shipped_date, order_date) AS days_to_ship
FROM orders;
示例 3:动态日期
sql
-- 计算距离今天还有多少天
SELECT DATEDIFF('2023-12-31', CURDATE()) AS days_remaining;
常见问题与注意事项
1. 参数顺序陷阱
- 确保第一个参数是更晚的日期,否则结果可能为负数:
sql
-- 错误写法(可能返回负数) SELECT DATEDIFF(start_date, end_date); -- 正确写法 SELECT DATEDIFF(end_date, start_date);
2. 时间部分被忽略
- 若需精确到小时/分钟,改用
TIMESTAMPDIFF()
:sql
SELECT TIMESTAMPDIFF(HOUR, '2023-10-01 08:00:00', '2023-10-01 20:30:00'); -- 输出:12(小时差)
3. 时区无关性
- 计算基于输入的日期值,不自动转换时区。若需处理时区,先显式转换:
sql
SELECT DATEDIFF(CONVERT_TZ('2023-10-01', '+00:00', '+08:00'), '2023-09-30');
- 核心用途:快速计算两个日期的间隔天数。
- 适用场景:统计业务周期、计算有效期剩余天数、分析事件间隔等。
- 避坑指南:注意参数顺序、忽略时间的特性,避免无效日期输入。