Почему «бесконечность» не содержится в диапазоне? - PullRequest
3 голосов
/ 29 апреля 2019

У меня есть диапазон, верхняя граница которого равна бесконечности.

Почему бесконечность не содержится в этом диапазоне?

Я ожидаю, что это возвращает true:

=> select '[2019-01-02, infinity]'::daterange @> 'infinity'::date;
 ?column? 
----------
 f
(1 row)

, потому что:

=> select 'infinity'::date = 'infinity'::date;
 ?column? 
----------
 t
(1 row)

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

Документация гласит:

Кроме того, некоторые типы элементов имеют понятие «бесконечность», но это просто еще одно значение, если рассматривать механизмы типов диапазона.,Например, в диапазонах отметок времени [today,] означает то же самое, что и [today,).Но [today,infinity] означает что-то отличное от [today,infinity) - последнее исключает специальное значение метки времени infinity.

Это, кажется, категорически противоречит вашим наблюдениям, потому что

SELECT 'infinity'::date;
   date   
----------
 infinity
(1 row)

Это объясняется тем, что PostgreSQL преобразует диапазоны «дискретных» типов (date и integer типов) в их «каноническое» представление:

SELECT '[2010-01-01,2010-02-28]'::daterange;
        daterange        
-------------------------
 [2010-01-01,2010-03-01)
(1 row)

Вот что произошло в вашем примере:PostgreSQL добавляет 1 к infinity (что не меняет значение) и преобразует включающую верхнюю границу в исключительную верхнюю границу.

Теперь это, возможно, не правильное поведение, поскольку теперь infinity нечасть интервала больше.Я отправил патч для этого, и он был исправлен с помощью commit e6feef571a .

1 голос
/ 29 апреля 2019

Благодаря ilmari.

Для тех, кто ищет рабочее решение для select '[2019-01-02, infinity]'::daterange @> 'infinity'::date;, то есть: не используйте infinity в качестве границы, используйте неограниченный диапазон:

> select '[2019-01-02,)'::daterange @> 'infinity'::date;
 ?column? 
----------
 t
(1 row)

> select '[2019-01-02,]'::daterange @> 'infinity'::date;
 ?column? 
----------
 t
(1 row)
1 голос
/ 29 апреля 2019
select '[2019-01-02, infinity]'::daterange;
+-------------------------------------------+
| daterange                                 |
|-------------------------------------------|
| DateRange('2019-01-02', 'infinity', '[)') |
+-------------------------------------------+

[) означает, что правая граница исключена.

Но обратите внимание, что эти бесконечные значения никогда не являются значениями типа элемента диапазона и никогда не могут быть частью диапазона.

https://www.postgresql.org/docs/current/rangetypes.html

Редактировать

Также обратите внимание:

select '[2019-01-01, 2019-01-31]'::daterange;         
+---------------------------------------------+
| daterange                                   |
|---------------------------------------------|
| DateRange('2019-01-01', '2019-02-01', '[)') |
+---------------------------------------------+

Включенный диапазон переведен вэксклюзивный ассортимент один день спустя.Как это должно быть сделано для бесконечности?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...