При вычитании одной даты из другой результатом является временной интервал. Временной интервал существует в Postgres как самостоятельный тип данных.

Даты складывать нельзя, но к дате прибавить временной интервал можно. Например, к 31.01.2023 12:00 добавить 3 часа - вполне законная операция с понятным результатом 31.01.2023 15:00.

Выполним эту операцию на практике:

SELECT timestamp '2023-01-31 12:00' + interval '3 hours' AS result
# result
1 2023-01-31 15:00:00

Вычитать временной интервал тоже можно:

SELECT timestamp '2023-01-31 12:00' - interval '3 hours' AS result
# result
1 2023-01-31 09:00:00

Ввод интервала

Временной интервал можно ввести в форме:

[@] количество единица [количество единица...] [направление]

где единица может принимать значения:

  • microsecond - микросекунды;
  • millisecond - миллисекунды;
  • second - секунды;
  • minute - минуты;
  • hour - часы;
  • day - дни;
  • week - недели;
  • month - месяцы;
  • year - годы;
  • decade - десятилетия;
  • century - века;
  • millennium - тысячелетия.
SELECT interval '1 day 12 hours 59 min 10 sec'
# interval
1 1 day 12:59:10

Направление может принимать значение ago (назад) или быть пустым.

SELECT interval '1 day 12 hours 59 min 10 sec ago'
# interval
1 -1 days -12:59:10

Знак @ является необязательным.

Количество может быть отрицательным числом.

SELECT interval '12 hours -10 minutes'
# interval
1 11:50:00

9.9 Разность дат

9.11 Динамическое построение интервала