Может ли диапазон дат Postgres включать бесконечность в качестве верхней границы? - PullRequest
1 голос
/ 07 марта 2019

Я не вижу, как создать диапазон дат с 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.

Есть идеи?

1 Ответ

1 голос
/ 07 марта 2019

Другой способ создания неограниченного диапазона - полностью исключить верхнюю границу, например, '["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     
...