Search code examples
sqlsnowflake-cloud-data-platform

Dynamic inputs to Date calendar CTE in Snowflake SQL


In Snowflake, how can I declare variables to make the this CTE calendar table dynamic?

The below works if I hardcode the start_date and day_count params, but I'd like to make it more dynamic.

SET '2020-01-01' = start_date
SET '2021-01-01' = end_date
SET day_count = @start_date - @end_date 


create temp table dummy_1(start_date date, end_date date, day_count int) as select $start_date::date, $end_date::date, datediff(day, $start_date::date,$end_date::date)

WITH T AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY SEQ4()) AS num,
        DATEADD('day', ROW_NUMBER() OVER (ORDER BY SEQ4()) - 1, @start_date)::DATE AS date
    FROM 
        TABLE(GENERATOR(ROWCOUNT => @day_count))
)
SELECT * 
FROM T

Solution

  • There may very well be a better way, but this is a way hinted at in the comments.

    Snowflake generators don't seem to like variables.

    SET start_date = '2020-01-01';
    SET end_date = '2021-01-01';
    
    create temp table dummy(start_date date, end_date date, day_count int) as
    select $start_date::date, $end_date::date, datediff(day, $start_date::date,$end_date::date);
    
    WITH T AS
    (
        SELECT 
            ROW_NUMBER() OVER (ORDER BY SEQ4()) AS num,
            DATEADD('day', ROW_NUMBER() OVER (ORDER BY SEQ4()) - 1, (select max(start_date) from dummy)) AS date
        FROM TABLE(GENERATOR(ROWCOUNT => ((select max(day_count) from dummy))))
    )
    SELECT * 
    FROM T