Я не вижу, как создать диапазон дат с 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()
возвращает true
.
Протестировано и воспроизведено с помощью Postgresql 9.6.5 и Postgresql 10,3.
Есть идеи?