SQL

Recursive CTE — Date Spine Generator

admin by @admin ADMIN
4d ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Generate a row per day (or month, year, hour) without a calendar table. Useful for filling gaps when a date has no events but you still want it in your output.
SQL
Raw
-- Every day in March 2025 (PostgreSQL has generate_series for this, but
-- the recursive CTE works on every database).
WITH RECURSIVE days AS (
    SELECT DATE '2025-03-01' AS day
    UNION ALL
    SELECT day + INTERVAL '1 day'
    FROM   days
    WHERE  day < DATE '2025-03-31'
)
SELECT day FROM days;

-- LEFT JOIN onto your data — zero-fill missing days for chart-ready output
WITH RECURSIVE days AS (
    SELECT DATE '2025-03-01' AS day
    UNION ALL
    SELECT day + INTERVAL '1 day' FROM days WHERE day < DATE '2025-03-31'
)
SELECT d.day,
       COALESCE(SUM(o.amount), 0) AS revenue
FROM   days d
LEFT   JOIN orders o ON DATE(o.created_at) = d.day
GROUP  BY d.day
ORDER  BY d.day;

-- PostgreSQL shortcut: generate_series
SELECT generate_series('2025-03-01'::date, '2025-03-31'::date, '1 day')::date AS day;
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.