MySQL 中 TIMEDIFF、TIMESTAMPDIFF、DATEDIFF 函数详解
这三个函数都是 MySQL 中常用的日期时间差值计算函数,但用途、参数和返回值完全不同。以下是详细对比和说明。
| 函数名称 | 返回值类型 | 功能描述 | 支持的时间单位 | 典型用途 |
|---|---|---|---|---|
| DATEDIFF | INT(天数) | 计算两个日期相差的天数(仅精确到天) | 天(忽略时间部分) | 计算两个日期之间相隔多少天 |
| TIMEDIFF | TIME 类型 | 计算两个时间/日期时间的差值,返回时:分:秒格式 | 时、分、秒、微秒 | 计算同一日内或跨天的小时级时间差 |
| TIMESTAMPDIFF | INT(指定单位) | 计算两个日期时间相差的完整单位数量(最灵活) | YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND, MICROSECOND 等 | 精确计算任意单位的间隔数量 |
1. DATEDIFF(expr1, expr2)
- 语法:
DATEDIFF(expr1, expr2) - 返回值:expr1 − expr2 的天数(整数)。时间部分被忽略。
- 计算规则:expr1 - expr2,正数表示 expr1 在 expr2 之后。
示例:
SELECTDATEDIFF('2025-12-30','2025-12-01');-- 29SELECTDATEDIFF('2025-12-01','2025-12-30');-- -29SELECTDATEDIFF('2025-12-30 10:00:00','2025-12-01 23:59:59');-- 29(时间部分忽略)适用场景:统计年龄(年份差需结合其他计算)、会员注册天数、订单间隔天数等。
2. TIMEDIFF(expr1, expr2)
- 语法:
TIMEDIFF(expr1, expr2) - 返回值:TIME 类型,格式为 ‘HHH:MM:SS’(可超过24小时,如 48:00:00,支持负值)。
- 限制:
- 两个参数都必须是 TIME 或 DATETIME 类型。
- 结果范围:-838:59:59 到 838:59:59(约34天多)。
- 如果差值超出范围,返回 NULL。
示例:
SELECTTIMEDIFF('2025-12-30 15:30:00','2025-12-30 10:20:30');-- '05:09:30'SELECTTIMEDIFF('10:20:30','15:30:00');-- '-05:09:30'SELECTTIMEDIFF('2025-12-31 12:00:00','2025-12-30 10:00:00');-- '26:00:00'适用场景:计算工作时长、打卡上下班时间差、会议持续时间等需要精确到秒的时间段。
3. TIMESTAMPDIFF(unit, expr1, expr2)
- 语法:
TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2) - 返回值:expr2 − expr1 的指定单位数量(整数)。
- 注意顺序:是 expr2 - expr1(与前两个函数顺序相反!)。
- 常用 unit 参数(不区分大小写):
- MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR
示例:
SELECTTIMESTAMPDIFF(DAY,'2025-12-01','2025-12-30');-- 29SELECTTIMESTAMPDIFF(MONTH,'2025-10-15','2025-12-20');-- 2SELECTTIMESTAMPDIFF(HOUR,'2025-12-30 10:00:00','2025-12-31 15:30:00');-- 29SELECTTIMESTAMPDIFF(YEAR,'2020-01-01','2025-12-30');-- 5SELECTTIMESTAMPDIFF(MINUTE,'10:00:00','15:30:45');-- 330适用场景:最常用!可以精确计算任意单位的时间差,如用户年龄(YEAR)、会员时长(MONTH)、响应时间(SECOND)等。
三者对比总结(记忆口诀)
| 需求 | 推荐函数 | 原因 |
|---|---|---|
| 只想知道相差多少天 | DATEDIFF | 最简单,直接返回天数 |
| 需要返回时:分:秒格式的时间差 | TIMEDIFF | 返回 TIME 类型,适合展示时长 |
| 需要精确到任意单位(年/月/日/时/分/秒) | TIMESTAMPDIFF(首选) | 最灵活,单位可自定义,推荐大多数场景使用 |
常见误区
- 参数顺序不一致:
- DATEDIFF 和 TIMEDIFF 是 expr1 - expr2
- TIMESTAMPDIFF 是 expr2 - expr1(后减前)
- DATEDIFF 忽略时间部分,而 TIMESTAMPDIFF(DAY, …) 会考虑完整时间。
- 计算年龄时不要直接用 DATEDIFF/365(闰年问题),推荐:
TIMESTAMPDIFF(YEAR,birth_date,CURDATE())-(DATE_FORMAT(CURDATE(),'%m%d')<DATE_FORMAT(birth_date,'%m%d'))
掌握了这三个函数,你就能轻松处理 MySQL 中绝大部分日期时间差计算需求!