Содержание статьи

В PostgreSQL извлечение года из даты или временной метки применяется при аналитике, фильтрации данных и построении отчетов. Часто требуется сгруппировать записи по году, сравнить периоды или выделить данные за определённый год без преобразования всей даты. Для этого СУБД предоставляет несколько инструментов, отличающихся синтаксисом и областью применения.
При работе с типами DATE и TIMESTAMP важно учитывать точность и временные зоны, чтобы результат оставался корректным. PostgreSQL также позволяет создавать вычисляемые столбцы и использовать встроенные функции, например CURRENT_DATE, что упрощает автоматизацию при обработке временных данных.
PostgreSQL: как получить год из даты
В PostgreSQL год из даты можно извлечь с помощью функции EXTRACT. Она возвращает числовое значение выбранной части даты. Пример базового запроса:
SELECT EXTRACT(YEAR FROM date_column) AS year_value FROM table_name;
Если требуется получить год в виде целого числа без десятичной точки, можно использовать приведение типа:
SELECT EXTRACT(YEAR FROM date_column)::INT AS year_value FROM table_name;
SELECT TO_CHAR(date_column, ‘YYYY’) AS year_text FROM table_name;
Обе функции корректно работают с типами DATE и TIMESTAMP, включая значения с часовыми поясами. При работе с временными метками, полученными из разных зон, рекомендуется заранее привести их к UTC с помощью функции AT TIME ZONE для единообразного результата.
Использование функции EXTRACT для получения года
Функция EXTRACT применяется для выделения отдельных элементов даты или временной метки. Она возвращает значение в виде числа с плавающей точкой, что позволяет использовать результат в арифметических операциях и агрегатных запросах.
Синтаксис функции прост: EXTRACT(field FROM source), где field – часть даты (например, YEAR, MONTH, DAY), а source – столбец или выражение с типом DATE или TIMESTAMP. Для получения года используется форма:
SELECT EXTRACT(YEAR FROM date_column) AS year_value FROM table_name;
Результат будет числом, например 2025. Если требуется целое число без десятичной точки, можно выполнить приведение типа: EXTRACT(YEAR FROM date_column)::INT.
Функция корректно обрабатывает значения с часовыми поясами, поэтому при использовании типа TIMESTAMP WITH TIME ZONE вычисления выполняются в соответствии с текущей зоной сеанса. Для унификации данных разных регионов рекомендуется выполнять преобразование времени через AT TIME ZONE.
EXTRACT часто применяют при группировке данных по году, например:
SELECT EXTRACT(YEAR FROM created_at) AS year, COUNT(*) FROM orders GROUP BY year ORDER BY year;
Такой подход упрощает анализ динамики записей по годам и не требует дополнительного преобразования данных в приложении.
Получение года из столбца типа DATE
Тип DATE хранит только календарную дату без времени. Для извлечения года используется функция EXTRACT, возвращающая числовое значение, соответствующее году из даты. Пример базового запроса:
SELECT EXTRACT(YEAR FROM date_column) AS year_value FROM table_name;
Если требуется привести результат к целому числу, можно добавить преобразование типа:
SELECT EXTRACT(YEAR FROM date_column)::INT AS year_value FROM table_name;
SELECT TO_CHAR(date_column, ‘YYYY’) AS year_text FROM table_name;
Различия между методами сведены в таблицу:
| Метод | Тип результата | Пример использования |
|---|---|---|
| EXTRACT(YEAR FROM date_column) | Число с плавающей точкой | SELECT EXTRACT(YEAR FROM order_date) FROM orders; |
| EXTRACT(… )::INT | Целое число | SELECT EXTRACT(YEAR FROM order_date)::INT FROM orders; |
| TO_CHAR(…, ‘YYYY’) | Текст | SELECT TO_CHAR(order_date, ‘YYYY’) FROM orders; |
Использование функции EXTRACT предпочтительно при числовых операциях и группировке по годам, тогда как TO_CHAR подходит для форматирования и текстового представления данных.
Извлечение года из временной метки TIMESTAMP

Тип TIMESTAMP в PostgreSQL хранит дату и время с точностью до микросекунд. Для выделения года используется функция EXTRACT, которая анализирует полное значение временной метки и возвращает числовой результат.
Пример стандартного запроса:
SELECT EXTRACT(YEAR FROM timestamp_column) AS year_value FROM table_name;
Если значение содержит часовой пояс (TIMESTAMP WITH TIME ZONE), PostgreSQL выполняет вычисление в контексте текущей временной зоны сеанса. Чтобы получить согласованный результат независимо от региона, рекомендуется использовать преобразование:
SELECT EXTRACT(YEAR FROM timestamp_column AT TIME ZONE ‘UTC’) AS year_value FROM table_name;
SELECT TO_CHAR(timestamp_column, ‘YYYY’) AS year_text FROM table_name;
При необходимости анализировать события по годам целесообразно использовать EXTRACT с приведением к целому типу, что упрощает группировку и фильтрацию:
SELECT EXTRACT(YEAR FROM timestamp_column)::INT AS year, COUNT(*) FROM logs GROUP BY year ORDER BY year;
Такой подход обеспечивает точное извлечение календарного года даже при наличии временных зон и разной точности временных данных.
Приведение даты к тексту и выделение года с помощью TO_CHAR
Функция TO_CHAR преобразует значения DATE или TIMESTAMP в текст по заданному шаблону. Для извлечения года используется формат ‘YYYY’. Пример базового запроса:
SELECT TO_CHAR(date_column, ‘YYYY’) AS year_text FROM table_name;
Особенности применения:
- Результат всегда возвращается как текст, что удобно для отображения и экспорта данных.
- Можно комбинировать с другими элементами формата, например: TO_CHAR(date_column, ‘YYYY-MM-DD’).
- Подходит для типов DATE и TIMESTAMP, включая временные метки с часовым поясом.
Примеры практического использования:
- Создание ключа для группировки по году: SELECT TO_CHAR(created_at, ‘YYYY’) AS year_key, COUNT(*) FROM events GROUP BY year_key;
- Форматирование даты для экспорта в CSV: SELECT TO_CHAR(event_date, ‘YYYY’) AS year, TO_CHAR(event_date, ‘MM-DD’) AS month_day FROM events;
Использование TO_CHAR предпочтительно, когда необходимо получить строковое представление года или составной текстовый формат даты.
Извлечение года из текстовой строки с преобразованием в дату
Если дата хранится в текстовом формате, необходимо сначала преобразовать строку в тип DATE или TIMESTAMP. Для этого используется функция TO_DATE с указанием шаблона формата строки.
Пример преобразования и извлечения года:
SELECT EXTRACT(YEAR FROM TO_DATE(‘2025-11-07’, ‘YYYY-MM-DD’)) AS year_value;
При использовании TO_DATE важно учитывать соответствие шаблона формату строки, иначе функция вернет ошибку. Например, строка ‘07.11.2025’ требует шаблона ‘DD.MM.YYYY’:
SELECT EXTRACT(YEAR FROM TO_DATE(‘07.11.2025’, ‘DD.MM.YYYY’)) AS year_value;
Для текстовых строк, содержащих дату и время, используется TO_TIMESTAMP с аналогичным шаблоном:
SELECT EXTRACT(YEAR FROM TO_TIMESTAMP(‘2025-11-07 14:30’, ‘YYYY-MM-DD HH24:MI’)) AS year_value;
Этот подход позволяет получать год из любых текстовых форматов даты, обеспечивая корректное преобразование перед вычислениями и фильтрацией по годам.
Получение текущего года с использованием CURRENT_DATE
Функция CURRENT_DATE возвращает текущую дату сервера в типе DATE. Для извлечения года применяется EXTRACT или TO_CHAR.
Примеры получения текущего года:
- С использованием EXTRACT и числового результата:
SELECT EXTRACT(YEAR FROM CURRENT_DATE) AS current_year;
- С приведением к целому числу:
SELECT EXTRACT(YEAR FROM CURRENT_DATE)::INT AS current_year;
- С использованием TO_CHAR для текстового формата:
SELECT TO_CHAR(CURRENT_DATE, ‘YYYY’) AS current_year_text;
Применение CURRENT_DATE удобно для:
- Фильтрации записей за текущий год: WHERE EXTRACT(YEAR FROM date_column) = EXTRACT(YEAR FROM CURRENT_DATE)
- Формирования отчетов с актуальной датой
- Создания вычисляемых столбцов, автоматически обновляющих год при добавлении новых записей
Использование CURRENT_DATE совместно с EXTRACT позволяет получать числовой год без преобразований и корректно работать с календарными вычислениями.
Работа с интервалами и вычисление разницы по годам
В PostgreSQL для вычисления разницы между датами можно использовать оператор вычитания и функцию AGE. Результат позволяет определить интервал в годах, месяцах и днях.
Пример вычисления разницы между двумя датами с использованием AGE:
SELECT AGE(‘2025-11-07’::DATE, ‘2018-03-15’::DATE) AS interval_result;
Функция возвращает значение типа INTERVAL, например 7 years 7 mons 22 days. Для извлечения только полного количества лет применяют EXTRACT:
SELECT EXTRACT(YEAR FROM AGE(‘2025-11-07’::DATE, ‘2018-03-15’::DATE)) AS years_difference;
При работе с временными метками (TIMESTAMP) важно учитывать временные зоны. Если требуется точное количество лет между событиями с учётом часового пояса, рекомендуется приводить значения к UTC перед вычислением:
SELECT EXTRACT(YEAR FROM AGE(timestamp1 AT TIME ZONE ‘UTC’, timestamp2 AT TIME ZONE ‘UTC’)) AS years_difference;
Этот метод позволяет:
- Определять длительность проектов или контрактов в годах
- Фильтровать записи по возрасту или стажу
- Строить агрегированные отчёты с разницей по годам
Использование AGE вместе с EXTRACT обеспечивает точный расчет разницы в годах без ручного деления интервала на 365 дней.
Создание вычисляемого столбца для автоматического выделения года

В PostgreSQL можно добавить вычисляемый столбец, который автоматически извлекает год из существующего столбца типа DATE или TIMESTAMP. Это упрощает фильтрацию и группировку данных без необходимости повторного вызова функций.
Пример создания вычисляемого столбца при добавлении нового столбца:
ALTER TABLE orders ADD COLUMN order_year INT GENERATED ALWAYS AS (EXTRACT(YEAR FROM order_date)::INT) STORED;
Особенности использования:
- Столбец order_year автоматически обновляется при вставке или изменении значения order_date.
- Использование типа INT облегчает выполнение арифметических операций и группировку по году.
- Можно применять в индексации для ускорения запросов, фильтрующих по году:
CREATE INDEX idx_order_year ON orders(order_year);
Применение вычисляемого столбца позволяет строить отчёты, фильтры и агрегаты без повторного вызова EXTRACT или TO_CHAR, что повышает производительность при больших объемах данных.
Вопрос-ответ:
Как в PostgreSQL извлечь год из столбца с типом DATE для группировки данных?
Для извлечения года из столбца типа DATE используют функцию EXTRACT. Например, чтобы сгруппировать заказы по году, можно написать: SELECT EXTRACT(YEAR FROM order_date)::INT AS year, COUNT(*) FROM orders GROUP BY year ORDER BY year; Функция возвращает числовое значение года, которое удобно использовать в агрегатных вычислениях и фильтрах.
В чем разница между использованием EXTRACT и TO_CHAR для получения года из TIMESTAMP?
Функция EXTRACT возвращает числовое значение, что позволяет выполнять арифметические операции, группировки и фильтрацию по году. Функция TO_CHAR преобразует дату или временную метку в текст по заданному шаблону, например TO_CHAR(timestamp_column, ‘YYYY’). Этот метод удобен для отображения или экспорта данных, когда требуется строковое представление года. Для вычислений предпочтительнее EXTRACT, для форматирования вывода — TO_CHAR.
Как получить текущий год в PostgreSQL без указания конкретной даты?
Текущую дату можно получить с помощью функции CURRENT_DATE. Из нее извлекают год через EXTRACT или TO_CHAR. Примеры: SELECT EXTRACT(YEAR FROM CURRENT_DATE)::INT AS current_year; или SELECT TO_CHAR(CURRENT_DATE, ‘YYYY’) AS current_year_text;. Это позволяет автоматически использовать актуальный год для фильтров, отчетов и вычисляемых столбцов.
Можно ли вычислять разницу в годах между двумя датами в PostgreSQL и как это сделать?
Да, для расчета разницы в годах используют функцию AGE, которая возвращает интервал между двумя датами. Например: SELECT AGE(‘2025-11-07’::DATE, ‘2018-03-15’::DATE) AS interval_result; Результат — 7 years 7 mons 22 days. Чтобы получить только количество полных лет, применяют EXTRACT: SELECT EXTRACT(YEAR FROM AGE(‘2025-11-07’::DATE, ‘2018-03-15’::DATE)) AS years_difference;. Метод корректно учитывает календарные особенности и годовые различия.
