By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE t(id INT,start_date DATE,end_date DATE)
INSERT INTO t VALUES
(1,'2021-12-20','2021-12-20'),
(2,'2021-12-15','2021-12-18'),
(3,'2021-12-10','2021-12-11')
Records: 3 Duplicates: 0 Warnings: 0
WITH RECURSIVE cte
AS
(
SELECT 1 i
UNION ALL
SELECT i + 1 i
FROM cte
WHERE i + 1 <= ( SELECT DATEDIFF(MAX(end_date),MIN(start_date))+1 FROM t )
), dmin AS
(
SELECT MIN(start_date) AS min_date FROM t
)
SELECT id, DATE_ADD(t2.min_date, INTERVAL i-1 DAY) AS date
FROM cte
LEFT JOIN (SELECT * FROM t JOIN dmin ) AS t2
ON DATE_ADD(t2.min_date, INTERVAL i-1 DAY) >= start_date
AND DATE_ADD(t2.min_date, INTERVAL i-1 DAY) <= end_date
WHERE start_date IS NOT NULL
ORDER BY id, date DESC
id | date |
---|---|
1 | 2021-12-20 |
2 | 2021-12-18 |
2 | 2021-12-17 |
2 | 2021-12-16 |
2 | 2021-12-15 |
3 | 2021-12-11 |
3 | 2021-12-10 |