Ich benutze oft eine TVF dynamische Datums-/Zeitbereiche zu erstellen. Ein Tally-Tisch würde das auch tun. Die UDF ist schneller als ein rekursiver CTE (besonders für größere Mengen) und bietet ein bisschen mehr Funktionalität. Date Range, DatePart und Increments sind Parameter.
Declare @YourTable table (StartDate date,frequency varchar(25))
Insert Into @YourTable values
('2016-01-02','1month'),
('2016-01-06','1month'),
('2016-03-10','3months'),
('2015-01-01','4months')
Select A.*
,NextDate=cast(B.RetVal as date)
From @YourTable A
Cross Apply (
Select Top 1 * From [dbo].[udf-Range-Date](A.StartDate,'2025-01-15','MM',left(A.frequency,1))
Where RetVal>=cast(GetDate() as date)
) B
Returns
StartDate frequency NextDate
2016-01-02 1month 2017-02-02
2016-01-06 1month 2017-01-06
2016-03-10 3months 2017-03-10
2015-01-01 4months 2017-05-01
Die UDF, wenn interessiert
CREATE FUNCTION [dbo].[udf-Range-Date] (@R1 datetime,@R2 datetime,@Part varchar(10),@Incr int)
Returns Table
Return (
with cte0(M) As (Select 1+Case @Part When 'YY' then DateDiff(YY,@R1,@R2)/@Incr When 'QQ' then DateDiff(QQ,@R1,@R2)/@Incr When 'MM' then DateDiff(MM,@R1,@R2)/@Incr When 'WK' then DateDiff(WK,@R1,@R2)/@Incr When 'DD' then DateDiff(DD,@R1,@R2)/@Incr When 'HH' then DateDiff(HH,@R1,@R2)/@Incr When 'MI' then DateDiff(MI,@R1,@R2)/@Incr When 'SS' then DateDiff(SS,@R1,@R2)/@Incr End),
cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
cte2(N) As (Select Top (Select M from cte0) Row_Number() over (Order By (Select NULL)) From cte1 a, cte1 b, cte1 c, cte1 d, cte1 e, cte1 f, cte1 g, cte1 h),
cte3(N,D) As (Select 0,@R1 Union All Select N,Case @Part When 'YY' then DateAdd(YY, N*@Incr, @R1) When 'QQ' then DateAdd(QQ, N*@Incr, @R1) When 'MM' then DateAdd(MM, N*@Incr, @R1) When 'WK' then DateAdd(WK, N*@Incr, @R1) When 'DD' then DateAdd(DD, N*@Incr, @R1) When 'HH' then DateAdd(HH, N*@Incr, @R1) When 'MI' then DateAdd(MI, N*@Incr, @R1) When 'SS' then DateAdd(SS, N*@Incr, @R1) End From cte2)
Select RetSeq = N+1
,RetVal = D
From cte3,cte0
Where D<[email protected]
)
/*
Max 100 million observations -- Date Parts YY QQ MM WK DD HH MI SS
Syntax:
Select * from [dbo].[udf-Range-Date]('2016-10-01','2020-10-01','YY',1)
Select * from [dbo].[udf-Range-Date]('2016-01-01','2017-01-01','MM',1)
*/
können Sie Beispieldaten zeigen, und – TheGameiswar
@TheGameiswar Beispieldaten Ergebnis erwartet hinzugefügt, lassen Sie mich wissen, wenn es nicht genug ist – quin61
Wie viele zukünftige Berichte? – McNets