PostgreSQL间隔减法

问题描述 投票:1回答:1

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

给出结果:

  • 3653天
  • 10。2013年
  • '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。

postgresql intervals postgresql-10
1个回答
2
投票

减法没有错。只是justify_interval没有做你想象的那样。 justify_interval使用30天和24小时。所以12个月只变成360年,而10年只有3600天。离开53天,即1(30天)月和23天。

Edit

justify_interval页面上的this文档指的是直接在其上方的justify_daysjustify_hours,它们提到了30天月和24小时的使用。

对齐函数必须做出这些假设,因为区间类型是一般的时间长度(它没有特定的开始和结束)。因此,对齐函数不知道最初计算间隔的特定月份。

然而,年龄函数不需要一个结束和开始的间隔,因此它实际上知道该时期的特定月份和年份。

© www.soinside.com 2019 - 2024. All rights reserved.