Получить даты начала / окончания недели и номер недели для недель, начинающихся в четверг - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть существующий проект, который представляет собой еженедельный отчет.Одним из его параметров является недельный диапазон.Это работает нормально, но им нужно пересмотреть отчет, вместо того, чтобы начинать неделю в первый день года, им нужно начинать неделю в первый четверг и заканчивать в субботу.У меня есть этот запрос

SELECT   MIN([DATE]) as StartWeek
            ,MAX([DATE]) as EndWeek
            ,DATENAME(WEEK,Convert(datetime,CONVERT(VARCHAR(10),CONVERT(DATE,[DATE]),101))) as [WEEK]

    FROM [somedb]
    WHERE DATENAME(Year,Convert(datetime,CONVERT(VARCHAR(10),CONVERT(DATE,[DATE]),101))) = 2018
    GROUP BY DATENAME(WEEK,Convert(datetime,CONVERT(VARCHAR(10),CONVERT(DATE,[DATE]),101)))

Результат этого запроса

Start Week    End Week    WEEK
2018-01-01    2018-01-07  1

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

Start Week                                         End Week    Week
2018-1-4(since its the first thursday of the week) 2018-1-10    1

Да, я могу DATEADD, нономер недели будет по-прежнему подтверждать 2018-1-8 как WEEK 2

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018
DECLARE @WeekDay Varchar(500),
        @Add     Int,
        @DATE    Date;

        SET @DATE = '2018-01-01';

        SELECT @WeekDay = DATENAME(DW,@DATE);

        SELECT @Add = CASE
                      WHEN  @WeekDay    =   'Thursday'  THEN 
                      0
                      WHEN  @WeekDay    =   'Friday'    THEN 
                      6
                      WHEN  @WeekDay    =   'Saturday'  THEN 
                      5
                      WHEN  @WeekDay    =   'Sunday'    THEN 
                      4
                      WHEN  @WeekDay    =   'Monday'    THEN 
                      3
                      WHEN  @WeekDay    =   'Tuesday'   THEN 
                      2
                      WHEN  @WeekDay    =   'Wednesday' THEN 
                      1
                  END

SELECT  DATEADD(DD,@Add, CONVERT(DATE,@DATE))   AS WeekStart,
        DATEADD(DD,@Add+6, CONVERT(DATE,@DATE)) AS WeekEnd,
        1                                       AS Week
0 голосов
/ 04 декабря 2018

Мы можем начать с установки первого дня недели в четверг, используя оператор SET DATEFIRST .Это означает, что для дальнейших расчетов потребуется неделя с четверга по среду вместо обычной.

Затем вы можете ограничить свои данные, начиная с первого четверга года, и, наконец, просто вычтите 1 из WEEK, чтобы получитьжелаемый вывод.

  set datefirst 4 --Set Thursday as first day of the week

  SELECT MIN(dt) as StartWeek, MAX(dt) as EndWeek, DATENAME(WEEK,dt)-1 as [WEEK]
  FROM #tbl
  WHERE YEAR(dt) = 2018
  AND dt >= (select min(dt) from #tbl where datename(WEEKDAY,dt) = 'Thursday')
  GROUP BY DATENAME(WEEk,dt)

Если вы удалите условие AND из фильтра, вашей первой строкой будет неделя 0, содержащая три дня в году до первого четверга.Даже в этом случае ваша неделя, начинающаяся 4 января 2018 года, все еще имеет номер 1.

ОБНОВЛЕНИЕ: нижеследующее должно быть в состоянии скорректироваться на недели, разделенные на 2 года.

set datefirst 4 --Set Thursday as first day of the week

select *, case when datepart(week,d1) > datepart(week,d2) then datepart(week,d1) else datepart(week,d2)-1 end from
(
select d1, max(d2) d2 from
(select t1.dt d1, t2.dt d2
from #tbl t1
inner join #tbl t2 on datediff(day,t1.dt,t2.dt) between 1 and 6
and t1.dt < t2.dt
and datename(weekday, t1.dt) = 'Thursday') s 
group by d1) t
  • Один разснова установите начало недели на четверг.
  • Далее, получите все четверги в вашем наборе данных и найдите соответствующий конец недели.
  • Наконец, добавьте проверку того, находится ли неделя в том же году - если это не так, возьмите номер недели для даты начала предыдущего года.Это даст вам ожидаемую непрерывность.

Я настроил тест здесь: https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=75582819ff0defb7366592f4a89e9604

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...