datediff只支持date类型,datetime会截断时间部分;返回两日期天数差,参数顺序决定正负,正确用法为datediff(end_date, start_date)。

MySQL DATEDIFF 函数只支持 DATE 类型,传入 DATETIME 会自动截断
DATEDIFF(date1, date2) 返回的是两个日期之间的**天数差**,但它的参数会被强制转为 DATE 类型——也就是丢掉时间部分。比如 '2024-03-15 23:59:59' 会被当作 '2024-03-15' 处理。
这意味着:如果两个 DATETIME 值只差几小时,DATEDIFF 也可能返回 0;而跨日哪怕只有 1 秒,也会算作 1 天。
- 要精确到小时/分钟/秒,别用 DATEDIFF,改用
TIMESTAMPDIFF - 如果输入字段是
DATETIME但你只关心“日期是否相同”,那 DATEDIFF 是安全的 - 显式转成 DATE 更清晰:
DATEDIFF(DATE(col1), DATE(col2))
计算天数差时,注意参数顺序决定正负号
DATEDIFF 是「第一个减第二个」:DATEDIFF(end_date, start_date) 才得到正数天数。反过来会是负值,容易在条件判断或排序中出错。
- 常见错误:写成
DATEDIFF(start_date, end_date),结果全是负数 - WHERE 子句里想查“过去 7 天内”,应写
DATEDIFF(CURDATE(), created_at) - ORDER BY 天数倒序(最新优先):用
DATEDIFF(CURDATE(), created_at) DESC
遇到 NULL 值,DATEDIFF 直接返回 NULL,不是 0
只要任一参数为 NULL,DATEDIFF 就返回 NULL。这在聚合或条件过滤时容易漏掉数据,尤其是 LEFT JOIN 后的可空字段。
- 检查前先用
IS NOT NULL过滤:WHERE date1 IS NOT NULL AND date2 IS NOT NULL - 需要默认值时,用
COALESCE包一层:DATEDIFF(COALESCE(date1, '1970-01-01'), COALESCE(date2, '1970-01-01')) - 别依赖隐式转换——
IFNULL(date1, '0000-00-00')在严格模式下会报错
替代方案:TIMESTAMPDIFF 支持更细粒度且不截断时间
如果实际要的是“两个时间点之间相隔多少完整小时”,或者想避免 DATE 截断带来的歧义,TIMESTAMPDIFF 更可靠。它按指定单位计算,保留原始精度。
- 天数:
TIMESTAMPDIFF(DAY, col1, col2) - 小时:
TIMESTAMPDIFF(HOUR, '2024-03-15 10:00:00', '2024-03-16 12:30:00')→ 返回26 - 注意单位是第一个参数,且大小写敏感(
DAY不是day) - 性能略低于 DATEDIFF(多一步时间解析),但业务逻辑清晰更重要











