Pregunta

Tengo una consulta (para usar en Bug Tracker.net) que calcula la cantidad de errores por semana por la semana. Pero la consulta devuelve el número de la semana, lo que realmente quiero es la primera fecha de la semana

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 parte que obtiene el número de la semana es

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

Devuelve esta salida:

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

Pero sería mejor decir la primera fecha de cada semana, por ejemplo, 01-01-2010, luego 08-01-2010, etc.

La pregunta no es un duplicado de ¿Cómo obtiene la" Fecha de inicio de la semana "y la" Fecha de finalización de la semana "desde el número de la semana en SQL Server? (la respuesta dice cómo obtener una semana desde una fecha no de un número de una semana)

No es un duplicado de Calcular la fecha de la fecha de la semana (pregunta pregunta por C #)

No es un duplicado de Obtenga la primera fecha de la semana desde la fecha proporcionada < / a> (pregunta pregunta por javascript)

Búsqueda pero no pude encontrar esta pregunta respondida para SQL Server (2010 si es importante)

¿Fue útil?

Solución

Si lo piensa de la manera correcta, la respuesta a SO 1267126 se puede aplicar a su problema.

Cada una de las fechas reportadas de errores que tiene en el grupo mapas a la misma semana. Por definición, por lo tanto, cada una de esas fechas de errores también debe asignar el mismo comienzo de la semana. Por lo tanto, ejecuta el cálculo de 'inicio de la semana a partir de la fecha de dada' en las fechas de los reportes de errores, así como el cálculo del número de la semana, y el grupo por expresiones (modestamente espantosas), y terminar con la respuesta que busca.

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


Dado que GeneracDicetAgcode es un DateTime (consulte el comentario; incluye un componente de tiempo), es necesario lanzarlo hasta la fecha antes de determinar el inicio de la semana (pero la expresión del número de la semana no necesita el reparto, y el ' Día de la semana 'parte de la semana de inicio de la semana tampoco necesita el reparto):

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: código no probado!

Otros consejos

Me doy cuenta de que este es un hilo muy viejo, pero "Obtenga la primera cita en una semana, dado el número de la semana" es exactamente lo que quería hacer y no tengo una fecha real con la que trabajar, por lo que la respuesta aceptada lo haríaNo funciona para mí.Pensé que publicaría mi solución para la posteridad.Tenga en cuenta que sospecho que los diferentes ajustes de la cultura pueden romper esto, por lo que pruebe antes de usar.

Mi respuesta se construye a partir de este uno.

Asumamos que usted sabe un número de semana y un año y desea obtener las fechas de inicio y finalización de esa semana de ese año.Esto es lo que tengo:

--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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top