试试看
DECLARE
@MinDate date='20140601',
@MaxDate date='20170531'
;WITH yearCTE AS(
SELECT @MinDate StartDate,DATEADD(YEAR,1,@MinDate) EndDate
UNION ALL
SELECT EndDate,IIF(DATEADD(YEAR,1,EndDate)<@MaxDate,DATEADD(YEAR,1,EndDate),@MaxDate)
-- if your version of SQLServer don't support IIF then use CASE
--SELECT EndDate,CASE WHEN DATEADD(YEAR,1,EndDate)<@MaxDate THEN DATEADD(YEAR,1,EndDate) ELSE @MaxDate END
FROM yearCTE
WHERE EndDate<@MaxDate
)
SELECT StartDate,EndDate
--SELECT StartDate,DATEADD(DAY,-1,EndDate) EndDate
FROM yearCTE
OPTION(MAXRECURSION 0);
DATEADD(DAY,365,...) 的变体
DECLARE
@MinDate date='20140601',
@MaxDate date='20170531'
;WITH yearCTE AS(
SELECT @MinDate StartDate,DATEADD(DAY,365,@MinDate) EndDate
UNION ALL
SELECT EndDate,IIF(DATEADD(DAY,365,EndDate)<@MaxDate,DATEADD(DAY,365,EndDate),@MaxDate)
-- if your version of SQLServer don't support IIF then use CASE
--SELECT EndDate,CASE WHEN DATEADD(DAY,365,EndDate)<@MaxDate THEN DATEADD(DAY,365,EndDate) ELSE @MaxDate END
FROM yearCTE
WHERE EndDate<@MaxDate
)
SELECT StartDate,EndDate
--SELECT StartDate,DATEADD(DAY,-1,EndDate) EndDate
FROM yearCTE
OPTION(MAXRECURSION 0);