为什么justify_interval('360天'::间隔)结果'1年'

时间:2017-02-14 13:53:08

标签: postgresql

出于某种原因,justify_interval(now() - '2013-02-14'::timestamptz)会产生奇怪的结果:

postgres=# select justify_interval(concat(365*4 +1,' days')::interval);                       -[ RECORD 1 ]----+----------------
justify_interval | 4 years 21 days

我查了一年:

postgres=# select justify_interval('365 days'::interval);
 justify_interval
------------------
 1 year 5 days

所以我走得更远:

postgres=# select justify_interval('360 days'::interval);
 justify_interval
------------------
 1 year
(1 row)

此行为不是特定于平台的(尝试了几个Linux,9.2,9.3,9.6)

为什么一年是360天?..

2 个答案:

答案 0 :(得分:1)

似乎你正在寻找一些东西,PostgreSQL称之为一个使用数年和数月的“符号”结果,而不仅仅是几天,这就是age(timestamp, timestamp)(和{ {1}})函数返回。

age(timestamp)

select age(now(), '2013-02-14'); -- 4 years 16:41:02.571547 select age(timestamp '2013-02-14'); -- 4 years 运算符始终返回天数(最多)的差异。 -函数(以及justify_*()*/<运算符)始终将值“切割”为平均值(即>1 day24 hours1 month)尽管事实上1天实际上可以包含23-25小时(只考虑夏令时时区)而1个月可以包含28-31天(因此结果取决于范围的实际起点和终点,这会创建间隔)。

答案 1 :(得分:0)

accrding to docs:

  

justify_interval(interval) - 使用justify_days和调整间隔   justify_hours,附加符号调整

并进一步:

  

justify_days(interval) - 调整间隔,以便30天的时间段   表示为月份

所以30*12=360

不期望但在文档中明确定义......