Сегодня я столкнулся с необъяснимым результатом в PostgreSQL 9.6 при выполнении этого запроса:
SELECT age('2018-06-30','2018-05-19') AS one,
age('2018-07-01','2018-05-20') AS two;
Ожидаемые результаты для обоих столбцов: 1 mon 11 days
. Однако, только за интервал с 2018-05-19 по 2018-06-30 я получаю то, что ожидаю, а за 2018-05-20 до 2018-07-01 я получу еще один день: 1 mon 12 days
Я не понимаю, почему это так, и, насколько я понимаю, между 2018-05-20 и 2018-07-01 это просто интервал 1 mon 11 days
, и результат Postgres здесь неверный.
Я не могу найти подробную информацию о том, как именно работает функция PostgreSQL- age(timestamp,timestamp)
. Тем не менее, я предположил, что функция выполняет что-то вроде: переходите от даты начала к шагу месяца, пока не достигнете конца месяца. Оттуда перейдите в день даты окончания. Подведите итоги по месяцам и дням.
Итак, в моем понимании, это то, что должно происходить в моем случае под капотом (извините, за столь многословность, но я чувствую, что это необходимо):
Начало в 2018-05-19. Идите на месяц вперед. Земля в 2018-06-19. Пройдите N
дней вперед, пока не достигнете 2018-06-30:
1 day: 20
2 days: 21
3 days: 22
4 days: 23
5 days: 24
6 days: 25
7 days: 26
8 days: 27
9 days: 28
10 days: 29
11 days: 30
= 1 month 11 days.
Для времени между 2018-05-20 и 2018-07-01 оно должно быть почти таким же:
Начало в 2018-05-20. Идите на месяц вперед. Земля в 2018-06-20. Пройдите N
дней вперед, пока не достигнете 2018-07-01:
1 day: 21
2 days: 22
3 days: 23
4 days: 24
5 days: 25
6 days: 26
7 days: 27
8 days: 28
9 days: 29
10 days: 30
11 days: 1
= 1 month 11 days.
Это моя ошибка или одна из PostgreSQL?
Существуют ли альтернативные функции / алгоритмы, которые работают так, как я описал / ожидал?