Функция date_trunc() в PostgreSQL: группировка по периодам

date_trunc(поле, дата) — функция PostgreSQL, которая «обрезает» дату или время до заданной точности: месяца, недели, дня, часа. Это стандартный способ группировать временные ряды: выручка по месяцам, DAU по дням, когорты по неделям. В SQLite прямого аналога нет — там используют strftime.

Синтаксис

date_trunc('month' | 'week' | 'day' | 'hour', timestamp_колонка)

Примеры использования

Пример 1: Выручка по месяцам

SELECT date_trunc('month', created_at)::date AS month,
       SUM(amount) AS revenue
FROM orders
GROUP BY 1
ORDER BY 1;

Результат:

month      | revenue
2026-01-01 | 45000
2026-02-01 | 52000

Пример 2: DAU — уникальные пользователи по дням

SELECT date_trunc('day', event_ts)::date AS day,
       COUNT(DISTINCT user_id) AS dau
FROM events
GROUP BY 1;

Результат:

day        | dau
2026-03-01 | 1240
2026-03-02 | 1310
Порешать SQL-задачи в тренажёре →

Типичная ошибка

date_trunc возвращает timestamp, а не date — поэтому для чистой даты добавляй приведение ::date. Неделя в PostgreSQL начинается с понедельника (ISO), это важно при сравнении с инструментами, где неделя с воскресенья. В SQLite date_trunc не работает — там нужен strftime('%Y-%m', …).

Где спрашивают на собеседовании

Группировка временных рядов через date_trunc — база продуктовой аналитики и почти любого дашборда. На собеседовании спрашивают «выручка по месяцам с приростом» — это date_trunc + GROUP BY + LAG.

FAQ: частые вопросы про date_trunc

Чем date_trunc отличается от EXTRACT?

date_trunc обрезает дату до начала периода и возвращает timestamp (например, начало месяца) — удобно для группировки. EXTRACT достаёт одно числовое поле (год, месяц, день недели) — удобно для фильтров и признаков.

Как сгруппировать по месяцам в SQLite, если нет date_trunc?

Используй strftime: strftime('%Y-%m', created_at) вернёт строку «2026-01», по которой и группируй. Это ближайший аналог date_trunc('month').

С какого дня начинается неделя в date_trunc?

В PostgreSQL date_trunc('week', …) считает неделю по ISO — с понедельника. Если нужна неделя с воскресенья, сдвигай дату на день перед усечением.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы SQL

Работа с датами · Анализ выручки

Другие функции SQL

LAG · EXTRACT · strftime · TO_CHAR · AGE · CURRENT_DATE

Открыть SQL-тренажёр (565 задач) →