我有一个场景,我需要将给定的日期范围拆分为每月间隔。
例如,输入如下所示:
StartDate EndDate
2018-01-21 2018-01-29
2018-01-30 2018-02-23
2018-02-24 2018-03-31
2018-04-01 2018-08-16
2018-08-17 2018-12-31
预期输出如下:
StartDate EndDate
2018-01-21 2018-01-29
2018-01-30 2018-01-31
2018-02-01 2018-02-23
2018-02-24 2018-02-28
2018-03-01 2018-03-31
2018-04-01 2018-04-30
2018-05-01 2018-05-31
2018-06-01 2018-06-30
2018-07-01 2018-07-31
2018-08-01 2018-08-16
2018-08-17 2018-08-31
2018-09-01 2018-09-30
2018-10-01 2018-10-31
2018-11-01 2018-11-30
2018-12-01 2018-12-31
以下是示例数据。
CREATE TABLE #Dates
(
StartDate DATE,
EndDate DATE
);
INSERT INTO #Dates
(
StartDate,
EndDate
)
VALUES
('2018-01-21', '2018-01-29'),
('2018-01-30', '2018-02-23'),
('2018-02-24', '2018-03-31'),
('2018-04-01', '2018-08-16'),
('2018-08-17', '2018-12-31');
4条答案
按热度按时间xeufq47z1#
可以使用递归CTE。基本思想是从第一个日期
2018-01-21
开始,建立一个到最后一个日期2018-12-31
为止的所有月份的开始和结束日期的列表。然后与数据进行内部连接,并在必要时钳住日期。如果rCTE不是一个选项,你总是可以JOIN一个数字表或日期表(上面的想法仍然适用)。
zlwx9yxi2#
您可以交叉应用Master..spt_values表,以便为StartDate和EndDate之间的每个月获取一行。
t9eec4r03#
下面的方法也应该有效
1.首先,我将startdates和enddates放入cte-block数据中的一列。
1.在som_eom块中,我为所有12个月创建了start_of_month和end_of_month。
1.我将步骤1和步骤2合并到curated_set中
1.我创建了curated_set,它是按日期列排序的
1.最后,我拒绝不需要的记录,在我的过滤器子句不在('som','StartDate')
jei2mxaa4#
从初始的StartDate开始计算月末,或者如果月末在同一个月内,则直接使用EndDate。使用新计算的EndDate+1作为递归的StartDate,然后重复计算。