Struktura twojego rekurencyjnego CTE jest wyłączona, a górna połowa unii powinna być przypadkiem bazowym nasion. Następnie część rekurencyjna powinna dodać jeden dzień do poprzedniej wartości przychodzącej:
WITH RECURSIVE cte (n, dt) AS (
SELECT 1, '2019-09-20'
UNION ALL
SELECT n + 1, TIMESTAMPADD(DAY, n, '2019-09-20') FROM cte WHERE n <= 5
)
SELECT * FROM cte;
Warto zauważyć, że używamy TIMESTAMPADD()
tutaj, aby obejść problem INTERVAL
wyrażenie, które tak naprawdę nie może przyjmować zmiennej.
Jeśli chcesz użyć tego podejścia do wygenerowania serii dat, które pasują do wartości od i do w Twojej tabeli, możesz spróbować sprzężenia:
SELECT
t1.dt
FROM cte t1
INNER JOIN yourTable t2
ON t1.dt BETWEEN t2.from_date AND t2.to_date;
W ten sposób rekurencyjne CTE działa jak kalendarz tabela.