使用PostgreSQL的AGE函数计算时间差为何结果不同?
两种PostgreSQL时间差计算方式结果不同的原因
核心差异:计算逻辑本质不同
直接时间相减(time1):
'2021-02-01'::timestamp - '2021-01-01'::timestamp计算的是两个时间点之间的实际精确时间间隔,得到的是精确到秒的interval类型值。2021年1月有31天,两个日期刚好间隔完整的31天,将总秒数转换为天数后结果自然是31。age()函数计算(time2):
age('2021-02-01'::timestamp, '2021-01-01'::timestamp)是按日历规则计算年月差值,返回的结果是1 mon(即1个月)。当用EXTRACT(epoch FROM ...)将这个interval转换为秒数时,PostgreSQL会采用默认规则——把1个月按30天换算(因为不同月份天数不固定,无法直接精确对应秒数),因此最终得到的天数为30。
额外验证示例
如果换成跨平年2月的日期,差异会更明显:
SELECT EXTRACT (epoch FROM ('2021-03-01'::timestamp - '2021-02-01'::timestamp)) / 3600 / 24 as time1, EXTRACT (epoch FROM age('2021-03-01'::timestamp , '2021-02-01'::timestamp)) / 3600 / 24 as time2
输出结果:
| time1 | time2 |
|---|---|
| 28 | 30 |
直接相减得到2021年2月实际的28天,而age()返回的1个月在转epoch时仍按30天计算。
内容的提问来源于stack exchange,提问作者matias cantella
相关产品推荐
相关产品推荐

