В этой статье я расскажу о возможностях работы с датой и временем в PostgreSQL. Основные функции будут разбираться на практических примерах.
Для опытов используем таблицу статистики боев, проведенных спортивной организацией Ultimate Fighting Championship (получена скрапингом сайта ufcstats.com, о котором подробнее писал здесь):
Вывод текущей даты и времени
SELECT current_date, current_time, current_timestamp
Извлечение частичной информации из даты и времени либо интервала
Для этого можно воспользоваться функцией EXTRACT с указанием требуемой информации (Field Value на рисунке ниже) и источника (TIMESTAMP, DATE или INTERVAL):
EXTRACT(значение FROM источник)
Варианты представлены на рисунке ниже (если в источнике передать тип DATE, он будет преобразован в TIMESTAMP):
Для примера получим некоторые части информации из поля даты поединков:
SELECT event, date, fighter_left, fighter_right, EXTRACT(YEAR FROM date) as year, EXTRACT(MONTH FROM date) as month, EXTRACT(DAY FROM date) as day, EXTRACT(HOUR FROM date) as hour
FROM ufc_stat
LIMIT 12
Получение интервалов между датами
Этот функционал можно реализовать с помощью функции AGE:
AGE(дата_и_время,дата_и_время);
Она возвращает интервал между разностью первого и второго аргументов. Если указан только один из них, то в качестве первого выступает текущая дата.
Рассмотрим использование функции на примере вывода поединков UFC, проведенных на расстоянии заданного количества дней (допустим, 385) от текущей даты:
SELECT event, date, fighter_left, fighter_right, AGE(date) as interval_from_now
FROM ufc_stat
WHERE EXTRACT(DAY FROM AGE(date))+ 30*EXTRACT(MONTH FROM AGE(date)) + 365*EXTRACT(YEAR FROM AGE(date)) < 385