Obtenir le premier jour et le mois pour les x dernières semaines calendaires

Je veux get la dernière semaine de 8 à partir d'aujourd'hui ( GETDATE() ) Donc le format doit être jj / mm pour toutes les 8 semaines. J'ai essayé quelque chose comme ça

 select "start_of_week" = cast(datepart(dd,dateadd(week, datediff(week, 0, getdate()), 0)) as CHAR(2))+'/'+cast(datepart(mm,dateadd(week, datediff(week, 0, getdate()), 0)) as CHAR(2)); 

et ce n'est bon que pour la semaine en cours, mais comment mettre cela en requête et revenir pour curr-1, curr-2, … curr-7 semaines. Le résultat final doit être une table avec des montants pour un joueur et chaque semaine au format jj / mm

Voici:

 DECLARE @DateTable TABLE ( ADate DATETIME ) DECLARE @CurrentDate DATETIME SET @CurrentDate = GETDATE() WHILE (SELECT COUNT(*) FROM @DateTable WHERE DATEPART( dw, ADate ) = 2) <= 7 BEGIN INSERT INTO @DateTable SELECT @CurrentDate SET @CurrentDate = DATEADD( dd, -1, @CurrentDate ) END SELECT "start_of_week" = cast(datepart(dd,dateadd(week, datediff(week, 0, ADate), 0)) as CHAR(2)) +'/'+cast(datepart(mm,dateadd(week, datediff(week, 0, ADate), 0)) as CHAR(2)) FROM @DateTable WHERE DATEPART( dw, ADate ) = 2 DELETE @DateTable 

SORTIE

 start_of_week 28/12 21/12 14/12 7 /12 30/11 23/11 16/11 9 /11 

Peut-être aussi facile que ça?

 WITH EightNumbers(Nmbr) AS ( SELECT 0 UNION SELECT -1 UNION SELECT -2 UNION SELECT -3 UNION SELECT -4 UNION SELECT -5 UNION SELECT -6 UNION SELECT -7 UNION SELECT -8 ) SELECT CONVERT(VARCHAR(5),GETDATE()+(Nmbr*7),103) FROM EightNumbers ORDER BY Nmbr DESC 

Si vous avez besoin (comme le titre le suggère) du "premier jour" de la semaine, vous pouvez changer la sélection pour:

 SELECT CONVERT(VARCHAR(5),GETDATE()+(Nmbr*7)-DATEPART(dw,GETDATE())+@@DATEFIRST,103) FROM EightNumbers ORDER BY Nmbr DESC 

Sachez que le «premier jour de la semaine» dépend de la culture de votre système. Jetez un oeil sur @@DATEFIRST !

Le résultat:

 28/12 21/12 14/12 07/12 30/11 23/11 16/11 09/11 02/11 

Syntaxe: select "start_of_week" = cast (datepart (jj, dateadd (semaine, datediff (semaine, 0, getdate ()) – X , 0)) comme CHAR (2))

  select "start_of_week" = cast(datepart(dd,dateadd(week, datediff(week, 0, getdate()) - 0, 0)) as CHAR(2)) , "previous_week1" = +'/'+cast(datepart(mm,dateadd(week, datediff(week, 0, getdate()) - 1, 0)) as CHAR(2)), "previous_week2" = +'/'+cast(datepart(mm,dateadd(week, datediff(week, 0, getdate()) - 2, 0)) as CHAR(2)), "previous_week3" = +'/'+cast(datepart(mm,dateadd(week, datediff(week, 0, getdate()) - 3, 0)) as CHAR(2)); 

et ainsi de suite …. merci

En supposant que sys.all_objects a au less 8 lignes et que vous voulez le premier jour de la semaine (que vous n'avez pas spécifié dans votre question:

 select top 8 convert(varchar(5), dateadd(WEEK, 1-1* ROW_NUMBER() over(order by newid()), dateadd(DD, 1-datepart(dw,getdate()), getdate())), 1) as [FirstDayOfWeek] from sys.all_objects 

Le converti donne juste le mois / jour. Le numéro de ligne est utilisé pour donner les numéros 1-8. J'ai multiplié le nombre de rangée par -1 et ajouté 1 pour get les nombres 0, -1, -2, …- 7 et la date a ajouté ceux-ci (par jour) au premier jour de cette semaine. J'ai trouvé le premier jour de cette semaine en prenant getdate et date en ajoutant la version négative du jour de la semaine + 1.