datediff()仅计算天数差,而timestampdiff()支持多种单位。datediff(date1, date2)返回两个日期间的天数差,不支持月或年;timestampdiff(unit, datetime1, datetime2)按指定单位(如second、minute…year)计算datetime2 – datetime1的差值;使用时需注意函数功能区别、参数顺序及单位正确性,避免结果错误。
在处理日期和时间相关的计算时,DATEDIFF() 和 TIMESTAMPDIFF() 是两个常用的函数。但很多人容易搞混它们的单位参数设置方式,导致结果出错。这篇文章就来聊聊这两个函数在使用时需要注意的单位设置问题。
DATEDIFF():只支持天数差,别指望它能算月或年
DATEDIFF() 这个函数的功能其实很简单,只能用来计算两个日期之间的天数差。它的语法通常是这样的:
DATEDIFF(date1, date2)
返回的是 date1 – date2 的天数差。比如:
SELECT DATEDIFF('2025-04-05', '2025-04-01'); -- 返回 4
注意:这个函数不支持按月、年、小时等其他单位来计算,如果你看到有人说“用 DATEDIFF 算两个日期相差几个月”,那他大概率是混淆了另一个函数。
TIMESTAMPDIFF():灵活多单位计算,单位参数很关键
如果你想按分钟、小时、天、周、月、年等不同单位来计算两个时间点之间的差异,应该使用 TIMESTAMPDIFF()。它的基本语法如下:
TIMESTAMPDIFF(unit, datetime1, datetime2)
其中,unit 是你指定的单位,顺序是 datetime2 – datetime1(注意顺序是反的)。常见的单位包括:
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
举个例子:
SELECT TIMESTAMPDIFF(MONTH, '2024-01-15', '2025-03-10'); -- 返回 13,因为从2024年1月到2025年3月有13个月
block||||||||block
常见错误与建议
使用这两个函数时,有几个容易踩坑的地方,值得特别提醒一下:
- ❌ 想当然地认为 DATEDIFF() 可以计算月份差 → 它只能算天数差。
- ❌ 把 TIMESTAMPDIFF() 的两个日期顺序搞反了 → 结果会是负数。
- ❌ 单位写错拼写或者用了中文单位 → sql 报错或结果不对。
建议:
- 如果只需要天数差,用 DATEDIFF() 最简单;
- 如果需要更精细的单位(比如月、年),优先用 TIMESTAMPDIFF();
- 写代码时可以加注释标明单位,避免后续维护混乱;
- 测试时多选几个边界情况验证,比如跨月、跨年、月初月末等。
基本上就这些。这两个函数虽然常见,但用对单位才能得出正确结果。有时候看着只是改个参数的事,但理解清楚逻辑后,才能少走弯路。