You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

输出结果:

time1time2
2830

直接相减得到2021年2月实际的28天,而age()返回的1个月在转epoch时仍按30天计算。

内容的提问来源于stack exchange,提问作者matias cantella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:20:46