timestampdiff 是最稳妥的日期差计算函数,返回整数单位差值,单位参数顺序为单位、起始时间、结束时间,不支持 week 但可除以 7 换算,month 按日历月计算;datediff 仅限日期天数差,忽略时间部分;timediff 仅适用于 time 类型或同日时分秒差;unix_timestamp 相减存在时区、闰秒、溢出等隐患,应避免使用。

用 TIMESTAMPDIFF 直接获取整数单位差值
想算两个日期之间相隔多少天、小时或月,TIMESTAMPDIFF 是最稳妥的选择。它返回整数,避免浮点误差,也明确区分单位含义。
注意单位参数顺序:第一个是单位(如 DAY、HOUR、MONTH),第二个是起始时间,第三个是结束时间——和直觉相反,容易写反。
-
TIMESTAMPDIFF(DAY, '2023-01-01', '2023-01-05')返回4(不是 5) - 单位不支持
WEEK,但可用DAY后除以 7 手动换算 -
MONTH按日历月计算:从 1月31日到2月28日算 1 个月,不是按30天机械加减
用 DATEDIFF 快速算天数差(仅限日期)
DATEDIFF 只接受 DATE 类型或能自动转为日期的字符串,忽略时间部分。如果字段含 DATETIME 或 TIMESTAMP,它会截断时间,只比对年月日。
-
DATEDIFF('2023-01-01 23:59:59', '2023-01-01 00:00:01')返回0 - 不能指定单位,固定按“天”计算,也不支持
YEAR或HOUR - 性能略优于
TIMESTAMPDIFF,因为不解析时间部分,适合纯日期场景
用 TIMEDIFF 算时间部分差(仅限同一天内)
当两个值都是 TIME 类型,或你只关心当天内的时分秒差异时,TIMEDIFF 返回 TIME 类型结果,比如 '02:30:00'。
-
TIMEDIFF('14:30:00', '12:00:00')返回'02:30:00' - 如果跨天(如
'01:00:00'减'23:00:00'),结果为负的TIME,MySQL 会显示'-22:00:00',但某些客户端可能渲染异常 - 不能直接用于
DATETIME字段;需先用TIME()提取时间部分
避免用 UNIX_TIMESTAMP 相减算时间差
虽然 UNIX_TIMESTAMP(dt1) - UNIX_TIMESTAMP(dt2) 能得出秒数,但隐患多:时区依赖强、闰秒不处理、超出 INT 范围(约68年)会溢出为负数。
- 若字段没显式指定时区,而 MySQL server 和 session 时区不一致,结果会错
-
UNIX_TIMESTAMP(NULL)返回NULL,参与运算后整个表达式变NULL,不易排查 - 不如直接用
TIMESTAMPDIFF(SECOND, dt1, dt2)清晰且无溢出风险
跨时区或长期跨度的时间差计算,必须确认字段类型与时区设置,否则看似正确的数字可能是错的。











