2017-02-14 1 views
0

По какой-то причине justify_interval(now() - '2013-02-14'::timestamptz) производит странные результаты:почему justify_interval ('360 дней' :: интервальные) результаты '1 год'

postgres=# select justify_interval(concat(365*4 +1,' days')::interval);      -[ RECORD 1 ]----+---------------- 
justify_interval | 4 years 21 days 

Я проверил один год:

postgres=# select justify_interval('365 days'::interval); 
justify_interval 
------------------ 
1 year 5 days 

Так что я пошел дальше :

postgres=# select justify_interval('360 days'::interval); 
justify_interval 
------------------ 
1 year 
(1 row) 

Такое поведение не конкретной платформы (пробовал несколько дистрибутивов Linux, 9.2, 9.3, 9.6)

Почему один год составляет 360 дней ..

ответ

0

accrding to docs:

justify_interval (интервал) - Установка интервала с использованием justify_days и justify_hours с дополнительными корректировками знаковых

и дальше?:

justify_days (интервал) - Установите интервал так периоды времени 30 дней представлены в виде месяца

Так 30*12=360

не ожидается, но, очевидно, определенных в документации ...

1

Кажется, что вы ищете что-то, что PostgreSQL называет «символическим» результатом, который использует годы и месяцы, а не просто дни, что и возвращает функции().

select age(now(), '2013-02-14'); -- 4 years 16:41:02.571547 
select age(timestamp '2013-02-14'); -- 4 years 

Оператор - всегда возвращает разницу в днях (не более). В justify_*() функции (и *, /, <, > операторов) всегда «вырезать» значение к среднему (т.е. 1 day является 24 hours и 1 month является 30 days), несмотря на то, что 1 день на самом деле может содержать 23-25 ​​часов (только подумайте летнее время) и 1 месяц может содержать 28-31 дней (поэтому результат зависит от фактической начальной и конечной точек диапазона, что создает интервал).