2017-04-20 2 views
1

un peu en difficulté avec ce ...MSSQL: Générer des dates entre 2 dates avec des pauses Mois

J'ai une table avec les colonnes suivantes:

Type  varchar 
StartDate datetime 
EndDate  datetime 
Interval int 

Ce que je veux est une table de résultats avec les tapez la colonne et toutes les dates entre la date de début et la date de fin, en utilisant l'intervalle comme des sauts de mois entre eux.

Par exemple, si la seule ligne de ma table est:

'Test', '2017-01-01', '2019-01-01', 6 

Je veux une table de résultats qui a 5 lignes, avec « Test » comme type sur chaque ligne, et une colonne de date qui va de :

'2017-01-01', 
'2017-07-01', 
'2018-01-01', 
etc. 

J'ai créé une table de calendrier et même une fonction de DateRange où je passe une date de début, date de fin et l'intervalle mois qui me retourne toutes les dates que je veux, mais comme il est un table- Fonction évaluée Je ne semble pas pouvoir l'appeler avec des données d'une autre table.

Comment faire?

Merci.

+0

Comment essayez-vous d'utiliser la fonction de plage de dates ? Pouvez vous donner un exemple? –

Répondre

1

Je vais souvent utiliser un TVF pour créer des plages de date/heure dynamiques. Un tableau de pointage/calendrier fera aussi l'affaire, mais l'UDF offre des fonctionnalités supplémentaires. Par exemple, vous fournir toute la gamme, DatePart et Increment

Declare @YourTable table ([Type] varchar(25),StartDate date,EndDate date,Interval int) 
Insert Into @YourTable values 
('Test','2017-01-01','2019-01-01', 6) 

Select A.[Type] 
     ,B.* 
From @YourTable A 
Cross Apply [dbo].[udf-Range-Date](A.StartDate,A.EndDate,'MM', A.Interval) B 

Retours

Type RetSeq RetVal 
Test 1  2017-01-01 
Test 2  2017-07-01 
Test 3  2018-01-01 
Test 4  2018-07-01 
Test 5  2019-01-01 

L'UDF si vous êtes intéressé

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) 
*/