【问题标题】:How to create a single date column from multiple date column with start date and end date?如何从具有开始日期和结束日期的多个日期列创建单个日期列?
【发布时间】:2022-01-25 22:33:40
【问题描述】:
我有一张包含此类数据的表格,没有重叠的日期:
| id |
start_date |
end_date |
| 1 |
2021-12-20 |
2021-12-20 |
| 2 |
2021-12-15 |
2021-12-18 |
| 3 |
2021-12-10 |
2021-12-11 |
我希望输出为:
| 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 |
我尝试使用min(start_date) and max(end_date) 范围内的生成日期创建表,并使用WHERE date>=start_date and date<=end_date 连接。
【问题讨论】:
标签:
mysql
sql
datediff
mysql-8.0
【解决方案1】:
您可以使用递归 CTE 来生成行以及加入您的表 (t),例如
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
Demo