Question

J'ai une requête (pour une utilisation dans Bug Tracker.net) qui calcule le nombre de bogues par semaine par statut. Mais la requête retourne le numéro de la semaine, ce que je veux vraiment, c'est la première date de la semaine

select datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date)))
       as [week], bg_status , st_name as [status], count(*) as [count] 
  from bugs inner join statuses on bg_status = st_id 
 group by datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date))),
          bg_status, st_name
 order by [week], bg_status

la partie qui obtient le numéro de semaine est

datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date))) as [week]

Il renvoie cette sortie:

week        bg_status   status                                        count
----------- ----------- --------------------------------------------- ------
22          1           new                                           1
22          5           closed                                        32

Mais il serait préférable de dire la première date de chaque semaine, par exemple 01-01-2010, puis 08-01-2010, etc.

question n'est pas un duplicata de Comment obtenez-vous la" date de début de la semaine "et" date de fin de semaine "à partir du numéro de semaine dans SQL Server? (Réponse dit comment obtenir la semaine à partir d'une date non d'une semaine numéro)

pas un duplicata de Calculer la date du numéro de semaine (question demande c #)

pas un duplicata de Obtenez la première date de la semaine à partir de la date fournie < / a> (question demande JavaScript)

J'ai effectué la recherche mais je n'ai pas trouvé cette question à laquelle répondit SQL Server (2010 si cela compte)

Était-ce utile?

La solution

Si vous y pensez de la bonne manière, la réponse à SO 1267126 peut être appliqué à votre problème.

Chacune des dates de bogue signalées dans les cartes du groupe jusqu'à la même semaine. Par définition, par conséquent, chacune de ces dates de bogue doit également mapper le même début de la semaine. Donc, vous exécutez le calcul de «début de la semaine à partir de la date de la date» sur les dates de rapport de bogues, ainsi que du calcul du numéro de la semaine et du groupe par des expressions (modestement horribles) et se retrouvent avec la réponse que vous recherchez.

SELECT DATEPART(wk, DATEADD(day, 0, DATEDIFF(d, 0, bg_reported_date))) [week],
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), bg_reported_date)
       AS [weekstart], bg_status, st_name AS [status], COUNT(*) AS [count] 
  FROM bugs INNER JOIN statuses ON bg_status = st_id 
 GROUP BY DATEPART(wk, DATEADD(day, 0, DATEDIFF(day, 0, bg_reported_date))),
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), bg_reported_date),
       bg_status, st_name
 ORDER BY [week], bg_status


Depuis que bg_reported_date est une date d'heure (voir le commentaire; il comprend un composant temporel), il est nécessaire de la jeter à ce jour avant de déterminer le début de la semaine (mais l'expression de numéro de semaine n'a pas besoin de la distribution et de la " Jour de la semaine 'Une partie de l'expression de début de semaine n'a pas besoin de la distribution non plus):

SELECT DATEPART(wk, DATEADD(day, 0, DATEDIFF(d, 0, bg_reported_date))) [week],
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1),
               CAST(bg_reported_date AS DATE)) AS [weekstart],
       bg_status, st_name AS [status], COUNT(*) AS [count] 
  FROM bugs INNER JOIN statuses ON bg_status = st_id 
 GROUP BY DATEPART(wk, DATEADD(day, 0, DATEDIFF(day, 0, bg_reported_date))),
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1),
               CAST(bg_reported_date AS DATE),
       bg_status, st_name
 ORDER BY [week], bg_status

NB: Code non testé!

Autres conseils

Je me rends compte que c'est un très vieux fil, mais "Obtenez la première date dans une semaine, étant donné le numéro de la semaine" est exactement ce que je voulais faire et je n'ai pas de date réelle pour travailler avec la réponse acceptée.ne fonctionne pas pour moi.Je pensais poster ma solution pour la postérité.Notez que je soupçonne que différents paramètres de culture peuvent casser cela, alors testez avant d'utiliser.

Ma réponse est construite à partir de Ceci un.

Supposons que vous connaissez un numéro de semaine et une année et vous souhaitez obtenir les dates de début et de fin de cette semaine de cette année.Voici ce que j'ai:

--These 2 "declared" variables would be passed in somehow
declare @WeekNumber int = DATEPART(wk, GETDATE())
declare @ForYear int = YEAR(GETDATE())-1

--Since we don't have a raw date to work with, I figured I could just start with 
--Jan 1 of that year.  I'll store that date in a cte here, but if you are doing this
--in a stored proc or function, it would make much more sense to use another @variable
;with x as
(
    --this method works in SQL 2008:
    SELECT CONVERT(DateTime, ('1/1/' + CONVERT(varchar, @ForYear))) as Jan1ForSelectedYear
    --If you are using 2014 or higher, you can use this instead:
    --DATETIME2FROMPARTS(@ForYear, 1, 1, 0,0,0,0,0)
)
--Now that we have a date to work with, we'll just add the number of weeks to that date
--That will bring us to the right week number of the given year.
--Once we have THAT date, we can get the beginning and ending of that week
--Sorry to make you scroll, but I think this is easier to see what is going on this way
SELECT  CONVERT(varchar(50), DateAdd(wk, (@WeekNumber - 1), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, x.Jan1ForSelectedYear) - 6, x.Jan1ForSelectedYear))), 101) as FirstDayOfWeekXForSelectedYear,
        CONVERT(varchar(50), DateAdd(wk, (@WeekNumber - 1), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, x.Jan1ForSelectedYear)    , x.Jan1ForSelectedYear))), 101) as LastDayOfWeekXForSelectedYear
FROM x

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top