我试图从时间戳中减去间隔,但与通过减去2个日期的天相比,我得到了错误的结果。
Ef。:
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天。
justify_interval
页面上的this文档指的是直接在其上方的justify_days
和justify_hours
,它们提到了30天月和24小时的使用。
对齐函数必须做出这些假设,因为区间类型是一般的时间长度(它没有特定的开始和结束)。因此,对齐函数不知道最初计算间隔的特定月份。
然而,年龄函数不需要一个结束和开始的间隔,因此它实际上知道该时期的特定月份和年份。