PostgreSQL 区间减法
PostgreSQL interval subtraction
我尝试从时间戳中减去时间间隔,但是通过减去 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;
给出结果:
- 3653 天
- 10.0013 年
- '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。
减法没有错。只是 justify_interval
没有达到您的预期。 justify_interval
使用 30 天的月份和 24 小时的天。所以 12 个月只有 360 年,10 年只有 3600 天。还剩 53 天,即 1(30 天)个月零 23 天。
编辑
this 页面上的 justify_interval
文档引用了直接在其上方的 justify_days
和 justify_hours
,其中确实提到使用 30 天每月和 24 小时每天.
证明函数确实必须做出这些假设,因为间隔类型是一般的时间长度(它没有特定的开始和结束)。所以 justify 函数不知道最初计算间隔的具体月份。
然而,年龄函数不采用间隔,它采用结束和开始,因此它实际上知道该时期内的具体月份和年份。
我尝试从时间戳中减去时间间隔,但是通过减去 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;
给出结果:
- 3653 天
- 10.0013 年
- '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。
减法没有错。只是 justify_interval
没有达到您的预期。 justify_interval
使用 30 天的月份和 24 小时的天。所以 12 个月只有 360 年,10 年只有 3600 天。还剩 53 天,即 1(30 天)个月零 23 天。
编辑
this 页面上的 justify_interval
文档引用了直接在其上方的 justify_days
和 justify_hours
,其中确实提到使用 30 天每月和 24 小时每天.
证明函数确实必须做出这些假设,因为间隔类型是一般的时间长度(它没有特定的开始和结束)。所以 justify 函数不知道最初计算间隔的具体月份。
然而,年龄函数不采用间隔,它采用结束和开始,因此它实际上知道该时期内的具体月份和年份。