SQL, который перечисляет X Records с The Weeknumber и датой понедельника на каждую неделю

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

  •  25-08-2022
  •  | 
  •  

Вопрос

Я ищу запрос SQL, который предоставит мне список еженедельных и даты понедельника на эту конкретную неделю.

Например:

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

Следующие просто выпускают одну неделю

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
Это было полезно?

Решение

Если у вас нет таблицы номеров, вы можете сгенерировать список последовательных чисел на лету, используя системные таблицы:

например

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

Если вам нужно расширить это для получения дополнительных чисел, вы можете пересечь таблицы:

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

Тогда вам просто нужно добавить/вычесть это количество недель с даты начала:

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;

Это словесный способ сделать это для пошаговой ясности, он может быть сжат с:

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;

Пример на скрипке SQL

Аарон Бертран сделал некоторые по всему глубину, сравнивая способы создания последовательных списков чисел:

Конечно, самый простой способ сделать это - создать календарный таблица

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top