2010-01-15 6 views
1

Je tente de remplir un tableau basé sur des intervalles de 2 et 3 semaines pour une période de paie bimensuelle dans TSQL. Le tableau doit remplir,TSQL Sélection des intervalles de 2 et 3 semaines

2 week date 
2 week date 
3 week date 
2 week date 
2 week date 
3 week date 

..based à la première date que je l'offre, puis en ajoutant 2 ou 3 semaines à la dernière date fournie. Je devrais être en mesure de fournir une date de début et une date de fin. Il se peut que ce soit juste tôt le matin, mais je ne peux pas imaginer une manière élégante d'accomplir cette tâche. Des pointeurs?

Merci! George

+0

'DATEADD (semaine, 2, @yourDate)'? –

+0

Cela va ajouter une statique de 2 semaines à chaque période. J'en ai besoin pour alterner entre 2-2-3-2-2-3 –

Répondre

1

approche force brute Horrid - parce que le 2,2,3 est difficile à boucler simplement l'ajouter indépendamment dans la table temporaire, puis filtrer à la fin Incase un couple d'entrées supplémentaires vont dans - pas le plus efficace, mais Si vous avez besoin d'obtenir une gamme, alors cela fonctionne.

Ainsi, la mise en garde ici est la suivante: ok pour une large, je ne voudrais pas utiliser dans la production :)

declare @start datetime 
declare @end datetime 
declare @calculated datetime 

set @start = '20010101' 
set @end = '20011231' 

set @calculated = @start 

Create Table #Dates (PayDate datetime) 

while @calculated <= @end 
begin 
    set @calculated = DateAdd(wk,2,@calculated) 
    insert into #Dates(paydate) values (@calculated) 
    set @calculated = DateAdd(wk,2,@calculated) 
    insert into #Dates(paydate) values (@calculated) 
    set @calculated = DateAdd(wk,3,@calculated) 
    insert into #Dates(paydate) values (@calculated) 
end 
select * from #Dates where paydate >= @start and paydate <= @end 
drop table #dates 
+0

Pas pour prod, juste pré-population de données. ;) –

0

Donc, vous avez un cycle de 7 semaines - comprendre quelle période de 7 semaines vous êtes à partir d'un point de départ connu, puis quelle semaine de ce groupe de 7 vous êtes.

3
WITH dates (d, n) AS 
     (
     SELECT @mydate, 1 
     UNION ALL 
     SELECT DATEADD(week, CASE n % 3 WHEN 0 THEN 3 ELSE 2 END, d), n + 1 
     FROM dates 
     WHERE d < @enddate 
     ) 
INSERT 
INTO mytable 
SELECT d 
FROM dates 
OPTION (MAXRECURSION 0) 
+0

Merci - n'a pas pu obtenir que cela fonctionne correctement. J'ai jeté un tas d'erreurs. Appréciez-le bien! :) –

+0

+1 pour l'ingéniosité d'utiliser le CTE pour le résoudre - je l'aime. – Andrew

Questions connexes