Работа с датами в SQL: date_trunc для группировки по периодам, EXTRACT для частей даты, INTERVAL для арифметики, часовые пояса и TO_CHAR. С примерами.
TL;DR: DATE_TRUNC('month', col) округляет timestamp до начала месяца. EXTRACT(YEAR FROM col) извлекает год. col + INTERVAL '1 day' — арифметика. TO_CHAR(col, 'YYYY-MM') — форматирование в строку. Часовые пояса через AT TIME ZONE. 90% аналитических запросов используют DATE_TRUNC для группировки.
В этой части:
DATE_TRUNC('unit', timestamp) округляет вниз до начала единицы.
EXTRACT(unit FROM timestamp) — возвращает число:
В PG два типа: TIMESTAMP (без TZ) и TIMESTAMPTZ (с TZ).
Правило: всегда храни в UTC (TIMESTAMPTZ), конвертируй для отображения:
WHERE created_at > '2026-06-02' для отчёта «за июнь» — включит только данные после 2 июня. Используй DATE_TRUNC('month', created_at) = '2026-06-01'.'2026-06-02 23:30 UTC' — это 3 июня в Москве. Конвертируй или храни всё в UTC.BETWEEN '2026-06-01' AND '2026-06-30' — для timestamp не включит 30 июня вечером. Используй >= и <.DATE_TRUNC. Он возвращает timestamp (2026-05-01), что даёт правильную сортировку и формат.
NOW() — текущий момент (timestamptz)CURRENT_DATE — сегодня (date)CURRENT_TIMESTAMP — то же что NOW()