我在餐桌上,我需要在第一个表格中基于两个日期创建一个新表格。第一个表格如下所示,日期格式为YYYY-MM-DD:
Start date | End date | Data
2015-09-01 | 2016-07-15 | 500
2016-05-01 | 2017-01-01 | 600
我需要表做的是取每一季度两个日期之间可能存在的所有季度末日期,并使用如下数据创建新行:
Date | Data
2015-09-30 | 500
2015-12-31 | 500
2016-03-31 | 500
2016-06-30 | 500
2016-06-30 | 600
2016-09-30 | 600
2016-12-31 | 600
[行多于以上两行。有人知道我该怎么做吗?谢谢:-)
这里是使用递归查询的方法。逻辑是在季度末进行迭代,直到用尽日期范围:
with cte as (
select
id,
dateadd(qq, datediff(qq, 0, start_date) + 1, -1) start_date,
end_date,
data
from mytable
union all
select
id,
dateadd(qq, datediff(qq, 0, dateadd(month, 4, start_date)), -1),
end_date,
data
from cte
where start_date < dateadd(qq, datediff(qq, 0, end_date), -1)
)
select cast(start_date as date) start_date, data from cte order by id, start_date
我添加了id
列,以唯一标识起始表中的每个记录。这不是查询所必需的,但它允许对结果集中的记录进行正确排序。
样本数据:
id |开始日期|结束日期|数据-:| :--------- | :--------- | ---:1 | 2015-09-01 | 2016-07-15 | 5002 | 2016-05-01 | 2017-01-01 | 600
查询结果:
开始日期|数据:--------- | ---:2015-09-30 | 5002015-12-31 | 5002016-03-31 | 5002016-06-30 | 5002016-06-30 | 6002016-09-30 | 6002016-12-31 | 600