如果我有两个日期,例如:
@StartDate = '2009/01/01'
@EndDate = '2015/02/05'
有没有办法以这种格式显示:
StartDate EndDate
2009/01/01 2010/01/01
2010/01/01 2011/01/01
2011/01/01 2012/01/01
2012/01/01 2013/01/01
2013/01/01 2014/01/01
2014/01/01 2015/01/01
2015/01/01 2015/02/05 <--- most importantly end using the end date
这可能吗?因为我看过一些CTE代码片段,但它们只分成2015年1月1日,而不是继续到05/02/2015期间结束?是否有可能包括最后一期的剩余时间 - 2015/01/01 - 2015/02/05,即使它不是一年?
答案 0 :(得分:3)
这是一种方式:
with nums as (
select 0 as n
union all
select 1 + n
from nums
where n < 100
)
select DATEADD(year, n, @StartDate) as StartDate,
(case when DATEADD(year, n+1, @StartDate) >= @EndDate then @EndDate
else DATEADD(year, n+1, @StartDate)
end) as EndDate
from nums
where dateadd(year, nums.n, @StartDate) < @EndDate
如果您的期间很长,则可能需要将nums
扩展到超过100个值。
答案 1 :(得分:-1)
DECLARE @StartDate DATETIME = '2009/01/01'
DECLARE @EndDate DATETIME = '2015/02/05'
;WITH Dates AS
(
SELECT
StartDate = @StartDate,
EndDate = DATEADD(YEAR, 1, @StartDate)
UNION ALL
SELECT
StartDate = DATEADD(YEAR, 1, StartDate),
EndDate = CASE
WHEN DATEADD(YEAR, 1, EndDate) > @EndDate
AND DATEADD(YEAR, -1, EndDate) < DATEADD(YEAR, -1, @EndDate) THEN @EndDate
ELSE DATEADD(YEAR, 1, EndDate)
END
FROM Dates
WHERE EndDate < @EndDate
)
SELECT * FROM dates
OPTION (MAXRECURSION 0)