DATEDIFF在MySQL中为DATEDIFF(end_date,start_date)返回天数差,SQL Server中为DATEDIFF(datepart,start_date,end_date)需指定单位,PostgreSQL无此函数而用日期相减,Oracle则用date2-date1后TRUNC取整。

DATEDIFF 是计算两个日期天数差最直接的函数,但不同数据库对参数顺序、单位支持和边界处理差异很大,直接套用容易出错。
MySQL 和 SQL Server 的 DATEDIFF 参数顺序相反
MySQL 的 DATEDIFF 只接受 DATE 类型,且固定为「结束日期减开始日期」:DATEDIFF('2024-05-10', '2024-05-01') 返回 9;而 SQL Server 的 DATEDIFF 要求显式指定单位,且参数顺序是「单位, 开始日期, 结束日期」:DATEDIFF(day, '2024-05-01', '2024-05-10') 才返回 9。如果在 SQL Server 里写成 DATEDIFF(day, '2024-05-10', '2024-05-01'),结果是 -9 —— 不报错但符号反了。
PostgreSQL 没有 DATEDIFF,得用减法运算
PostgreSQL 不提供 DATEDIFF 函数,而是直接支持 DATE 类型相减:'2024-05-10'::DATE - '2024-05-01'::DATE 返回整数 9。注意必须确保两边都是 DATE 类型,否则可能触发隐式转换失败;如果字段是 TIMESTAMP,建议先用 DATE() 或 ::DATE 截断时间部分,避免因时分秒导致意外结果(比如 '2024-05-10 00:00:01' 减 '2024-05-01 23:59:59' 在某些场景下会算作 8 天)。
Oracle 用 MONTHS_BETWEEN 配合 FLOOR 容易误算天数
Oracle 没有原生的天数差函数,常用 MONTHS_BETWEEN 算月差,再乘以平均天数——但这不是精确天数。真正要算完整天数,得用日期相减:date2 - date1,结果是小数(单位为天),所以 TRUNC(date2 - date1) 才是整数天数。常见错误是忘记 TRUNC,导致带小时的部分被保留(如 9.041666...),或误用 ROUND 导致跨天四舍五入。
跨数据库移植时,最容易忽略的是日期类型隐含精度和减法行为的一致性——哪怕都叫“日期”,TIMESTAMP WITH TIME ZONE 在 PostgreSQL 和 Oracle 中的处理逻辑完全不同,不显式截断或转换,结果可能差好几个小时甚至一天。











