Je veux avoir les huit dernières semaines à partir d'aujourd'hui (GETDATE()) Le format doit donc être jj / mm pour 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 question et revenir pour curr-1, curr-2, ... curr-7 semaines. Le résultat final doit être une table avec quelques montants pour un joueur et chaque semaine au format jj / mm

1
user2171512 28 déc. 2015 à 15:30

4 réponses

Meilleure réponse

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
0
Stanislovas Kalašnikovas 28 déc. 2015 à 12:50

Peut-être aussi simple que cela?

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 l'indique) du "premier jour" de la semaine, vous pouvez modifier la sélection en:

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 œil sur @@DATEFIRST!

Le résultat:

28/12
21/12
14/12
07/12
30/11
23/11
16/11
09/11
02/11
1
Shnugo 28 déc. 2015 à 13:02

Syntaxe: sélectionnez "start_of_week" = cast (datepart (jj, dateadd (semaine, dateiff (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

0
jitendra joshi 28 déc. 2015 à 12:40

En supposant que sys.all_objects a au moins 8 lignes et que vous voulez le premier jour de la semaine (ce 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 nombres 1 à 8. J'ai multiplié le numéro de ligne par -1 et ajouté 1 pour obtenir les nombres 0, -1, -2, ...- 7 et la date les ai ajoutés (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.

0
Jason Brady 28 déc. 2015 à 13:54