SQL从具有两个日期的行中创建在季度末具有日期的行

问题描述 投票:1回答:1

我在餐桌上,我需要在第一个表格中基于两个日期创建一个新表格。第一个表格如下所示,日期格式为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

[行多于以上两行。有人知道我该怎么做吗?谢谢:-)

sql sql-server tsql date recursive-query
1个回答
0
投票

这里是使用递归查询的方法。逻辑是在季度末进行迭代,直到用尽日期范围:

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列,以唯一标识起始表中的每个记录。这不是查询所必需的,但它允许对结果集中的记录进行正确排序。

Demo on DB Fiddle

样本数据:

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
© www.soinside.com 2019 - 2024. All rights reserved.