PostgreSQL | Как создать интервал из двух дат?

PostgreSQL | Как создать интервал из двух дат?

PostgreSQL предлагает нам основные 6 типов для работы с датами и временами:

  • timestamp without time zone
  • timestamp with time zone
  • date
  • time without time zone
  • time with time zone
  • interval

Так вот проблема может заключаться в том, что для вычисления интервала мы можем передавать не те типы (либо разные типы).

 

Как создать интервал из двух типов «timestamp with time zone» в PostgreSQL?

Это самый простой способ получения интервала:

SELECT timestamp with time zone '2022-12-10 13:43:46.909582' - timestamp with time zone '2022-11-08 14:42:30.301597';

Мы используем литеральную запись метки времени с зоной. В результате указания типа данных, PostgreSQL различает левый и правый операнды для знака минус и возвращает нам интервал. Важно учитывать положение дат относительно знака. Иначе можно из меньшего вычитать большее и получить отрицательный интервал.

Получили тип interval из разницы двух типов timestamp with time zone в PostgreSQL
Получили тип interval из разницы двух типов timestamp with time zone в PostgreSQL

 

Как создать интервал из двух типов «date» в PostgreSQL?

Ситуация немного усложняется, когда мы хотим вычесть из одного типа «date» другой тип «date«. Вместо интервала мы получим тип «integer«.

SELECT date '2022-12-10' - date '2022-11-08';

Скриншот:

Получили тип integer из разницы двух типов date в PostgreSQL
Получили тип integer из разницы двух типов date в PostgreSQL

 

Это немного раздражает, потому что ты желаешь получить похожий и логичный результат. Ожидаешь увидеть тип «interval» вместо «integer«. Как быть в этой ситуации?

Нужно приводить тип «date» к типу «timestamp«.

SELECT timestamp '2022-12-10' - timestamp '2022-11-08';

Здесь также вы видите запись в литеральном стиле, но по факту в коде у вас будут переменные вместо литералов.

Получили тип interval из разницы двух типов date в PostgreSQL
Получили тип interval из разницы двух типов date в PostgreSQL

 

Информационные ссылки

PostgreSQL | Как отобрать сегодняшние записи из таблицы?

PostgreSQL | Как отобрать вчерашние записи из таблицы?

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Команды SQLhttps://postgrespro.ru/docs/postgresql/15/sql-commands

Функции для работы с метками времени — https://postgrespro.ru/docs/postgresql/15/functions-datetime

Функция date_trunc()https://postgrespro.ru/docs/postgresql/15/functions-datetime#FUNCTIONS-DATETIME-TRUNC