Postgres daterange 可以包含无穷大作为上限吗?
Can a Postgres daterange include infinity as an upper bound?
我看不出如何创建一个以 infinity
作为上限的日期范围。 Postgres 将两个输入都转换为独占上限:
create table dt_overlap (
id serial primary key,
validity daterange not null
);
insert into dt_overlap (validity) values
('["2019-01-01", infinity]'),
('["2019-02-02", infinity)');
table dt_overlap;
id │ validity
────┼───────────────────────
1 │ [2019-01-01,infinity)
2 │ [2019-02-02,infinity)
select id,
upper(validity),
upper_inf(validity),
not isfinite(upper(validity)) as is_inf
from dt_overlap;
id │ upper │ upper_inf │ is_inf
────┼──────────┼───────────┼────────
1 │ infinity │ f │ t
2 │ infinity │ f │ t
这两个值给出相同的结果在某种程度上是意料之中的,因为包含上限 infinity]
被强制为排他上限 infinity)
.
范围的下限不存在相同的问题,因为日期范围保持包含下限,因此 lower_inf()
returns true
.
使用 Postgresql 9.6.5 和 Postgresql 10.3 进行测试和复制。
有什么想法吗?
另一种创建无限范围的方法是完全忽略上限,例如'["2019-01-01",)'
with dt_overlap (validity) as (
values
('["2019-01-01", infinity]'::daterange),
('["2019-02-01",]'::daterange)
)
select validity,
upper_inf(validity)
from dt_overlap;
结果
validity | upper_inf
----------------------+----------
[2019-01-01,infinity) | false
[2019-02-01,) | true
我看不出如何创建一个以 infinity
作为上限的日期范围。 Postgres 将两个输入都转换为独占上限:
create table dt_overlap (
id serial primary key,
validity daterange not null
);
insert into dt_overlap (validity) values
('["2019-01-01", infinity]'),
('["2019-02-02", infinity)');
table dt_overlap;
id │ validity
────┼───────────────────────
1 │ [2019-01-01,infinity)
2 │ [2019-02-02,infinity)
select id,
upper(validity),
upper_inf(validity),
not isfinite(upper(validity)) as is_inf
from dt_overlap;
id │ upper │ upper_inf │ is_inf
────┼──────────┼───────────┼────────
1 │ infinity │ f │ t
2 │ infinity │ f │ t
这两个值给出相同的结果在某种程度上是意料之中的,因为包含上限 infinity]
被强制为排他上限 infinity)
.
范围的下限不存在相同的问题,因为日期范围保持包含下限,因此 lower_inf()
returns true
.
使用 Postgresql 9.6.5 和 Postgresql 10.3 进行测试和复制。
有什么想法吗?
另一种创建无限范围的方法是完全忽略上限,例如'["2019-01-01",)'
with dt_overlap (validity) as (
values
('["2019-01-01", infinity]'::daterange),
('["2019-02-01",]'::daterange)
)
select validity,
upper_inf(validity)
from dt_overlap;
结果
validity | upper_inf
----------------------+----------
[2019-01-01,infinity) | false
[2019-02-01,) | true