PostgreSQL间隔减法

时间:2018-09-17 15:55:09

标签: postgresql intervals postgresql-10

我尝试从时间戳中减去间隔,但是与天相比,通过减去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;

给出结果:

  • 3653天
  • 10.0013年
  • '10年 1月23日'时间间隔测试

有人可以帮助我了解减法有什么问题吗?

反之亦然,没关系:

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。

1 个答案:

答案 0 :(得分:2)

减法没有错。只是justify_interval并没有达到您的期望。 justify_interval使用30天和24小时制。因此12个月只有360天,而10年只有3600天。剩下53天,即1(30天)个月和23天。

编辑

this页上的justify_interval文档指的是justify_daysjustify_hours,它们正上方,它们确实提到使用30天和24小时。 / p>

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

然而,年龄函数并不需要一定的时间间隔,它需要一个终点和一个起点,因此它实际上知道该时期内的特定月份和年份。