首页 > 解决方案 > 对于两个日期之间的每个季度,在 SQL SERVER 中逐季度添加行

问题描述

我有一个表,类型为 int、datetime、datetime:

id    start date    end date
--    ----------    ----------
1     2019-04-02    2020-09-17
2     2019-08-10    2020-08-10

这是创建/插入:

CREATE TABLE dbo.something
(
  id           int, 
  [start date] datetime, 
  [end date]   datetime
);

INSERT dbo.something(id,[start date],[end date]) 
  VALUES(1,'20190402','20200917'),(2,'20190810','20200810');

什么是可以产生这些结果的 SQL 查询:

id    Year    Quarter
--    ----    ----------
1     2019    2
1     2019    3
1     2019    4
1     2020    1
1     2020    2
1     2020    3
2     2019    3
2     2019    4
2     2020    1
2     2020    2
2     2020    3

标签: sqlsql-server

解决方案


只需使用递归 CTE。此版本从第 0 年切换到计算季度:

with cte as (
      select id, 
             year(start_date) * 4 +  datepart(quarter, start_date) - 1 as yyyyq,
             year(end_date) * 4 + datepart(quarter, end_date) - 1 as end_yyyyq
      from t
      union all
      select id, yyyyq + 1, end_yyyyq
      from cte
      where yyyyq < end_yyyyq
     )
select id, yyyyq / 4 as year, (yyyyq % 4) + 1 as quarter
from cte;

是一个 db<>fiddle。


推荐阅读