Почему результат age () не всегда эквивалентен интервалу при возврате во времени? - PullRequest
0 голосов
/ 04 июня 2018

Я столкнулся с неожиданным поведением своего кода SQL в вычислениях дат на поворотах PostgreSQL 9.6.Анализируя, я обнаружил, что Postgres не всегда возвращает одно и то же значение для возврата n дней, а затем вычисляет длительность с помощью age().

. Рассмотрим этот код: мы устанавливаем один день как "base ", перейдите на 45 дней назад и затем рассчитайте продолжительность.

WITH basedate AS (SELECT '2018-05-01'::date AS b), 
     myperiod AS (SELECT (basedate.b - interval '45 days') AS "startDate",
     basedate.b AS "endDate" FROM basedate)
SELECT age("endDate","startDate") FROM myperiod;

Я ожидаю, что этот запрос всегда будет приводить к 45 days.Однако, если я поменяю basedate на 2018-06-01, я получу 44 days.

Почему это так?

Я думаю, это как-то связано с майским31 деньОднако я не могу точно объяснить, почему, поскольку 2018-05-01 и 2018-06-01 приведут к одинаковой продолжительности, если я изменю 45 days на 15 days.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Ответ Лоренца Альбе указывает на правильную вещь: я должен был ожидать результат, начинающийся с 1 mon.

Проблема была на самом деле в клиенте, в данном случае OmniDB 2.8.См. Здесь: GitHub OmniDB: OmniDB автоматически преобразует интервалы в дни? Проблема была исправлена ​​в OmniDB 2.9

Во всех других протестированных мной клиентах я получил результат, подобный предсказанному Laurenz Albe.

Итак, если вы столкнулись с подобной проблемой: проверьте, есть ли проблема в вашем клиенте или в используемой вами библиотеке.

0 голосов
/ 04 июня 2018

Это не совсем так.

Ваш первый запрос возвращает

      age      
---------------
 1 mon 15 days
(1 row)

, и если вы измените дату на 2018-06-01, вы получите

      age      
---------------
 1 mon 14 days
(1 row)

Обане так ли?

Проблема скорее в том, что PostgreSQL рассматривает месяц как 30 дней в таких функциях, как justify_interval:

SELECT justify_interval('45 days');

 justify_interval 
------------------
 1 mon 15 days
(1 row)

Но тогда альтернативой будетвыдает ошибку, и поведение четко документировано.

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