PostgreSQL 区间减法

PostgreSQL interval subtraction

我尝试从时间戳中减去时间间隔,但是通过减去 2 个日期与天相比,我得到了错误的结果。

例如:

select 
  (now::date - past::date) as days,
  (now::date - past::date) / 365.25 as years,
  justify_interval(now - past::date) as interval_test
from (
  select '2020-09-17 00:00:01'::timestamp as now, '2010-09-17 00:00:01'::timestamp as past
) b;

给出结果:

谁能帮我理解减法有什么问题?

反之亦然,没问题:

select 
  (past::date + 3653)::date,
  (past + interval '10 years')::date,
  (past + 10*interval '1 year')::date,
  (past + 10*12*interval '1 month')::date
from (
  select '2020-09-17 00:00:01'::timestamp as now, '2010-09-17 00:00:01'::timestamp as past
) b;

所有结果给出相同的日期'2020-09-17'

我做错了什么?

我正在使用 PostgreSQL 10.5。

减法没有错。只是 justify_interval 没有达到您的预期。 justify_interval 使用 30 天的月份和 24 小时的天。所以 12 个月只有 360 年,10 年只有 3600 天。还剩 53 天,即 1(30 天)个月零 23 天。

编辑

this 页面上的 justify_interval 文档引用了直接在其上方的 justify_daysjustify_hours,其中确实提到使用 30 天每月和 24 小时每天.

证明函数确实必须做出这些假设,因为间隔类型是一般的时间长度(它没有特定的开始和结束)。所以 justify 函数不知道最初计算间隔的具体月份。

然而,年龄函数不采用间隔,它采用结束和开始,因此它实际上知道该时期内的具体月份和年份。