Как получить номер недели, дату начала и дату окончания года Compelete в SQL Server? - PullRequest
3 голосов
/ 07 ноября 2019

Как получить полный номер недели, начальную дату и конечную дату полного года.

Примечание

  1. Неделя начинается с воскресенья по субботу

  2. в то же время неделя № 1 (например: с 01-01-2020 по 04-01-2020) и на прошлой неделе должна быть (например: с 27-12-2020 по 31-12)-2020)

Ожидаемый результат

WeekNo  WeekStartDate   WeekEndDate
===================================
   1    2019-01-01      2019-01-05
   2    2019-01-06      2019-01-12
   3    2019-01-13      2019-01-19
   4    2019-01-20      2019-01-26
   5    2019-01-27      2019-02-02
   6    2019-02-03      2019-02-09
   7    2019-02-10      2019-02-16
   8    2019-02-17      2019-02-23
   9    2019-02-24      2019-03-02
   ...
   ...upto end of the year

На самом деле я пробовал это также rextester

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Если вас интересует только 2019 , то следующий код выдаст именно то, что вы ищете:

DECLARE @weekNum INT = 1;

WITH Weeks AS (
    SELECT @weekNum AS WeekNo
    UNION ALL
    SELECT WeekNo + 1 FROM Weeks WHERE WeekNo + 1 <= 53
)
SELECT  WeekNo,
        CASE
          WHEN WeekStartDate < '2019-01-01' THEN CONVERT(DATE, '2019-01-01')
          ELSE CONVERT(DATE, WeekStartDate)
        END AS WeekStartDate,
        CASE
          WHEN WeekEndDate > '2019-12-31' THEN CONVERT(DATE, '2019-12-31')
          ELSE CONVERT(DATE, WeekEndDate)
        END AS WeekEndDate
  FROM  (
        SELECT  WeekNo,
                DATEADD(WEEK, WeekNo - 1, '2018-12-30') AS WeekStartDate,
                DATEADD(WEEK, WeekNo - 1, '2019-01-05') AS WeekEndDate
          FROM  Weeks
        ) a

ВЫХОД:

WeekNo  WeekStartDate   WeekEndDate
1       2019-01-01      2019-01-05
2       2019-01-06      2019-01-12
3       2019-01-13      2019-01-19
4       2019-01-20      2019-01-26
5       2019-01-27      2019-02-02
6       2019-02-03      2019-02-09
7       2019-02-10      2019-02-16
8       2019-02-17      2019-02-23
...
51      2019-12-15      2019-12-21
52      2019-12-22      2019-12-28
53      2019-12-29      2019-12-31

Редактировать следующий комментарий ОП о переменная даты начала и окончания

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

DECLARE @startDate DATE = CONVERT(DATE, '2019-01-01');
DECLARE @endDate DATE = CONVERT(DATE, '2019-12-31');
DECLARE @weekNum INT = 1;

WITH Weeks AS (
    SELECT @weekNum AS WeekNo
    UNION ALL
    SELECT WeekNo + 1 FROM Weeks WHERE WeekNo + 1 <= DATEDIFF(WEEK, @StartDate, @EndDate) + 1
)
SELECT  WeekNo,
        CASE
          WHEN WeekStartDate < @startDate THEN @startDate
          ELSE CONVERT(DATE, WeekStartDate)
        END AS WeekStartDate,
        CASE
          WHEN WeekEndDate > @endDate THEN @endDate
          ELSE CONVERT(DATE, WeekEndDate)
        END AS WeekEndDate
  FROM  (
        SELECT  WeekNo,
                DATEADD(WEEK, WeekNo - 1, OffsetStartDate) AS WeekStartDate,
                DATEADD(WEEK, WeekNo - 1, OffsetEndDate) AS WeekEndDate
          FROM  Weeks
            INNER JOIN  (
                        SELECT  CASE
                                    WHEN DATEPART(WEEKDAY, @startDate) = 1 THEN @startDate
                                    ELSE DATEADD(DAY, 1 - DATEPART(WEEKDAY, @startDate), @startDate)
                                END AS OffsetStartDate,
                                CASE
                                    WHEN DATEPART(WEEKDAY, @startDate) = 1 THEN DATEADD(DAY, 6, @startDate)
                                    ELSE DATEADD(DAY, 7 - DATEPART(WEEKDAY, @startDate), @startDate)
                                END AS OffsetEndDate
                        ) a ON 1 = 1
        ) a

Просто измените @startDate и @endDate, чтобы отразить желаемые даты начала и окончания. Формат строки: YYYY-MM-DD.

. Будет выведено переменное число недель между двумя датами, начиная и заканчивая указанной датой (создавая частичные недели по мере необходимости). Надеюсь, согласно требованию.

0 голосов
/ 07 ноября 2019

Слегка обновите ответ выше Мартина. Вы можете передать @startDate и @endDate в зависимости от ваших предпочтений.

DECLARE @startDate DATETIME = '2019-01-01'
DECLARE @endDate DATETIME = '2021-01-01'
DECLARE @totalWeeks BIGINT= NULL

SELECT @totalWeeks =datediff(ww,@startdate,@enddate)

DECLARE @weekNum INT = 1;
WITH Weeks AS (
    SELECT @weekNum AS WeekNo
    UNION ALL
    SELECT WeekNo + 1 FROM Weeks WHERE WeekNo + 1 <= @totalWeeks
)

SELECT  WeekNo,
        CASE
          WHEN WeekStartDate < @startDate THEN CONVERT(DATE, '2019-01-01')
          ELSE CONVERT(DATE, WeekStartDate)
        END AS WeekStartDate,
        CASE
          WHEN WeekEndDate > @endDate THEN CONVERT(DATE, '2019-12-31')
          ELSE CONVERT(DATE, WeekEndDate)
        END AS WeekEndDate
  FROM  (
        SELECT  WeekNo,
                DATEADD(WEEK, WeekNo - 1, @startDate) AS WeekStartDate,
                DATEADD(WEEK, WeekNo - 1, @endDate) AS WeekEndDate
          FROM  Weeks
        ) a
    OPTION (MAXRECURSION 1000);
...