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 различает левый и правый операнды для знака минус и возвращает нам интервал. Важно учитывать положение дат относительно знака. Иначе можно из меньшего вычитать большее и получить отрицательный интервал.
Как создать интервал из двух типов «date» в PostgreSQL?
Ситуация немного усложняется, когда мы хотим вычесть из одного типа «date» другой тип «date«. Вместо интервала мы получим тип «integer«.
SELECT date '2022-12-10' - date '2022-11-08';
Скриншот:
Это немного раздражает, потому что ты желаешь получить похожий и логичный результат. Ожидаешь увидеть тип «interval» вместо «integer«. Как быть в этой ситуации?
Нужно приводить тип «date» к типу «timestamp«.
SELECT timestamp '2022-12-10' - timestamp '2022-11-08';
Здесь также вы видите запись в литеральном стиле, но по факту в коде у вас будут переменные вместо литералов.
Информационные ссылки
PostgreSQL | Как отобрать сегодняшние записи из таблицы?
PostgreSQL | Как отобрать вчерашние записи из таблицы?
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Команды SQL — https://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