SQL que enumera X registra con el número de semana y la fecha del lunes para cada semana

StackOverflow https://stackoverflow.com/questions/20353802

  •  25-08-2022
  •  | 
  •  

Pregunta

Estoy buscando una consulta SQL que me proporcione una lista del número de semana y la fecha del lunes para esa semana en particular.

Por ejemplo:

WeekNumber  DateMonday
39          2013-09-23
40          2013-09-30
...         ...

Los siguientes justo producen una semana

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
¿Fue útil?

Solución

Si no tiene una tabla de números, puede generar una lista de números secuenciales en la marcha usando tablas del sistema:

p.ej

SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM    sys.all_objects;

Si necesita extender esto para más números, puede cruzar las tablas de unión:

SELECT  Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

Entonces solo necesita sumar/restar estos números de semanas desde su fecha de inicio:

DECLARE @Monday DATE = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0);

WITH Numbers AS
(   SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
    FROM    sys.all_objects
)
SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, - n.Number, @Monday)
            FROM    Numbers n
        ) w;

Esta es una forma detallada de hacer esto para una claridad paso a paso, se puede condensar a:

SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) - ROW_NUMBER() OVER(ORDER BY object_id), 0)
            FROM    sys.all_objects
        ) w;

Ejemplo en el violín SQL

Aaron Bertrand ha realizado algunas formas de comparación en profundidad de generar listas secuenciales de números:

Por supuesto, la forma más fácil de hacer esto sería crear un mesa de calendario

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