PostgreSQL generate_series: заполнить пропуски в датах
generate_series создаёт непрерывный календарный ряд, который можно соединить с агрегатами таблицы. Так отчёт показывает дни без событий с нулём вместо того, чтобы пропускать их. Это удобно для графиков и ежедневных сводок. Сверяйте календарные границы и часовой пояс с требованиями отчёта.
Рабочий пример
WITH calendar AS (
SELECT day::date AS day
FROM generate_series(
date '2026-10-01', date '2026-10-07', interval '1 day'
) AS day
), sales(day, amount) AS (
VALUES (date '2026-10-01', 12), (date '2026-10-04', 7)
)
SELECT calendar.day, COALESCE(sum(sales.amount), 0) AS total
FROM calendar
LEFT JOIN sales USING (day)
GROUP BY calendar.day
ORDER BY calendar.day;LEFT JOIN сохраняет календарные даты без продаж, а COALESCE превращает NULL в 0. Группировка нужна, если в источнике несколько событий на один день.
Частый вопрос
Как построить календарь по месяцам?
Передайте generate_series границы с interval '1 month' и приведите результат к date или началу месяца. Для отчёта по неделям используйте подходящий интервал и согласованную бизнес-зону.