PostgreSQL интервальное вычитание - PullRequest
0 голосов
/ 17 сентября 2018

Я пытался вычесть интервал из отметки времени, но я получил неправильный результат по сравнению с днями, вычитая 2 даты.

например:.

select 
  (now::date - past::date) as days,
  (now::date - past::date) / 365.25 as years,
  justify_interval(now - past::date) as interval_test
from (
  select '2020-09-17 00:00:01'::timestamp as now, '2010-09-17 00:00:01'::timestamp as past
) b;

дает результаты:

  • 3653 дней
  • 10,0013 лет
  • '10 лет 1 мес 23 дня 'интервальный тест

Может ли кто-нибудь помочь мне понять, что не так с вычитанием?

Когда я делаю это наоборот, все нормально:

select 
  (past::date + 3653)::date,
  (past + interval '10 years')::date,
  (past + 10*interval '1 year')::date,
  (past + 10*12*interval '1 month')::date
from (
  select '2020-09-17 00:00:01'::timestamp as now, '2010-09-17 00:00:01'::timestamp as past
) b;

все результаты дают одинаковую дату '2020-09-17'

Что я делаю не так?

Я использую PostgreSQL 10.5.

1 Ответ

0 голосов
/ 17 сентября 2018

Нет ничего плохого в вычитании. Просто justify_interval не делает то, что вы ожидаете. justify_interval использует 30 дней и 24 часа. Таким образом, 12 месяцев становится только 360, а 10 лет - только 3600 дней. Оставив 53 дня, что составляет 1 (30 дней) месяц и 23 дня.

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

Документация justify_interval на этой странице относится к justify_days и justify_hours, которые находятся прямо над ней, где упоминается использование 30 дней, месяцев и 24 часов.

Функции выравнивания действительно должны делать это предположение, потому что тип интервала представляет собой общий промежуток времени (у него нет определенного начала и конца). Поэтому функции выравнивания не знают, за какие конкретные месяцы был первоначально рассчитан интервал.

Функция age, однако, не берет интервал, а принимает конец и начало, поэтому она фактически знает, какие конкретные месяцы и годы находятся в этом периоде.

...