出于某种原因,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天?..
答案 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 day
而24 hours
是1 month
)尽管事实上1天实际上可以包含23-25小时(只考虑夏令时时区)而1个月可以包含28-31天(因此结果取决于范围的实际起点和终点,这会创建间隔)。
答案 1 :(得分:0)
justify_interval(interval) - 使用justify_days和调整间隔 justify_hours,附加符号调整
并进一步:
justify_days(interval) - 调整间隔,以便30天的时间段 表示为月份
所以30*12=360
不期望但在文档中明确定义......