113 votes

Obtenez la date de début de semaine et la date de fin de semaine à partir du numéro de semaine.

J'ai une requête qui compte les dates de mariage des membres dans la base de données.

SELECT 
  SUM(NumberOfBrides) AS [Wedding Count]
  , DATEPART( wk, WeddingDate) AS [Week Number]
  , DATEPART( year, WeddingDate) AS [Year]
FROM  MemberWeddingDates
GROUP BY DATEPART(year, WeddingDate), DATEPART(wk, WeddingDate)
ORDER BY SUM(NumberOfBrides) DESC

Comment puis-je savoir quand le début et la fin de chaque semaine sont représentés dans l'ensemble de résultats ?

SELECT
  SUM(NumberOfBrides) AS [Wedding Count]
  , DATEPART(wk, WeddingDate) AS [Week Number]
  , DATEPART(year, WeddingDate) AS [Year]
  , ??? AS WeekStart
  , ??? AS WeekEnd
FROM  MemberWeddingDates
GROUP BY DATEPART(year, WeddingDate), DATEPART(wk, WeddingDate)
ORDER BY SUM(NumberOfBrides) DESC

189voto

Robin Day Points 39440

Vous pouvez trouver le jour de la semaine et faire un ajout de date sur les jours pour obtenir les dates de début et de fin

DATEADD(dd, -(DATEPART(dw, WeddingDate)-1), WeddingDate) [WeekStart]

DATEADD(dd, 7-(DATEPART(dw, WeddingDate)), WeddingDate) [WeekEnd]

Vous devriez également envisager de supprimer l'heure de la date.

3 votes

Gardez à l'esprit que le réglage DATEFIRST à autre chose que 7 casse ça.

6 votes

Cela ne le "cassera" pas, il utilisera datefirst pour définir WeekStart = à ce que DateFirst dit être le premier jour de la semaine. Votre version utilisera toujours le lundi et le dimanche comme début et fin de semaine, et non pas ce que le serveur est configuré pour utiliser comme début et fin de semaine.

1 votes

Hm... C'est un point valable, +1. :) Je vais supprimer le mien, alors (bien que pour être un tir dans le pied, il était extrêmement bien visé. g ).

44voto

Tomalak Points 150423

Voici un DATEFIRST solution agnostique :

SET DATEFIRST 4     /* or use any other weird value to test it */
DECLARE @d DATETIME

SET @d = GETDATE()

SELECT
  @d ThatDate,
  DATEADD(dd, 0 - (@@DATEFIRST + 5 + DATEPART(dw, @d)) % 7, @d) Monday,
  DATEADD(dd, 6 - (@@DATEFIRST + 5 + DATEPART(dw, @d)) % 7, @d) Sunday

11 votes

C'est génial, mais le lundi ne fonctionnait pas pour moi. J'ai dû ajouter "0 - " pour obtenir les lundis. Mon code du lundi est maintenant : DATEADD(dd, 0 - (@@DATEFIRST + 5 + DATEPART(dw, @d)) % 7, @d)

0 votes

J'ai upvotedé la réponse et le commentaire de Warren. Sql Server Version 11.0.5058.0 donne au moins la mauvaise date pour le lundi sans la modification de Warren. Il me donnait plutôt le vendredi.

0 votes

Notez que le décalage + 5 dans la réponse peut devoir changer en fonction du début de la semaine. Par exemple, si le début de la semaine est le dimanche, la réponse doit être la suivante - 1

1voto

riya Points 11

La requête ci-dessous donnera les données entre le début et la fin de la semaine en cours. en commençant du dimanche au samedi

SELECT DOB FROM PROFILE_INFO WHERE DAY(DOB) BETWEEN
DAY( CURRENT_DATE() - (SELECT DAYOFWEEK(CURRENT_DATE())-1))
AND
DAY((CURRENT_DATE()+(7 - (SELECT DAYOFWEEK(CURRENT_DATE())) ) ))
AND
MONTH(DOB)=MONTH(CURRENT_DATE())

0voto

user3370040 Points 1

Je viens de rencontrer un cas similaire à celui-ci, mais la solution proposée ici ne semble pas m'aider. J'essaie donc de trouver une solution par moi-même. Je travaille sur la date de début de semaine seulement, la date de fin de semaine devrait être de la même logique.

Select 
      Sum(NumberOfBrides) As [Wedding Count], 
      DATEPART( wk, WeddingDate) as [Week Number],
      DATEPART( year, WeddingDate) as [Year],
      DATEADD(DAY, 1 - DATEPART(WEEKDAY, dateadd(wk, DATEPART( wk, WeddingDate)-1,  DATEADD(yy,DATEPART( year, WeddingDate)-1900,0))), dateadd(wk, DATEPART( wk, WeddingDate)-1, DATEADD(yy,DATEPART( year, WeddingDate)-1900,0))) as [Week Start]

FROM  MemberWeddingDates
Group By DATEPART( year, WeddingDate), DATEPART( wk, WeddingDate)
Order By Sum(NumberOfBrides) Desc

-4voto

Labeeb Points 1

Pour les requêtes Access, vous pouvez utiliser le format suivant comme champ

"FirstDayofWeek:IIf(IsDate([ForwardedForActionDate]),CDate(Format([ForwardedForActionDate],"dd/mm/yyyy"))-(Weekday([ForwardedForActionDate])-1))"

Calcul direct autorisé..

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X