我尝试从时间戳中减去间隔,但是与天相比,通过减去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。
答案 0 :(得分:2)
减法没有错。只是justify_interval
并没有达到您的期望。 justify_interval
使用30天和24小时制。因此12个月只有360天,而10年只有3600天。剩下53天,即1(30天)个月和23天。
this页上的justify_interval
文档指的是justify_days
和justify_hours
,它们正上方,它们确实提到使用30天和24小时。 / p>
justify函数确实必须进行这些假设,因为间隔类型是一般的时间长度(没有特定的开始和结束)。因此,证明功能不知道最初计算间隔的具体月份。
然而,年龄函数并不需要一定的时间间隔,它需要一个终点和一个起点,因此它实际上知道该时期内的特定月份和年份。