首页 > 解决方案 > 每 6 个月动态拆分日期范围。开始日期可以是任何东西,但加起来是月份范围

问题描述

请帮助将日期范围划分为每 6 个月,开始日期可以是任何东西,但使用开始日期,我们只需要添加 09-30,第二天 10 月 1 日应该成为开始日期。我尝试使用递归 cte 但仍然没有得到确切的结果

startdate  enddate
06-22-2018   09-30-2022

输出

startdate  enddate
06-22-2018 09-30-2018
10-01-2018 03-31-2019
04-01-2019 09-30-2019
10-01-2019 03-31-2020
04-01-2020 09-30-2020

标签: sqlsql-server

解决方案


您可以使用递归 CTE:

with cte as (
      select startdate, eomonth(datefromparts(year(startdate), 9, 1)) as enddate, enddate as orig_enddate
      from t
      union all
      select dateadd(day, 1, enddate), eomonth(dateadd(month, 5, dateadd(day, 1, enddate))) as enddate, orig_enddate
      from cte
      where enddate < orig_enddate
     )
select *
from cte;

是一个 db<>fiddle。

目前尚不清楚您希望第一行是哪一年。根据您的问题,这使用开始日期当年的 9 月 30 日。

如果您需要超过 100 个日期,请添加option max(recursion 0).


推荐阅读