SQL DATEPART (dw, date) требуется понедельника = 1 и воскресенья = 7

У меня есть запрос, где я получаю WeekDay даты, но по умолчанию:

  • Воскресенье = 1

  • Модей = 2

  • и т.п.

Функция:

DATEPART(dw,ads.date) as weekday

Мне нужен результат:

  • Воскресенье = 7

  • Понедельник = 1

  • и т.п.

Есть ли ярлык для этого? Или мне нужно будет сделать CASE statement?

Ответ 1

Вы можете использовать формулу как:

(weekday + 5) % 7 + 1

Если вы решите использовать это, было бы полезно просмотреть несколько примеров, чтобы убедить себя, что это действительно то, что вы хотите.

дополнение: для того, чтобы переменная DATEFIRST не влияла на нее (для нее может быть любое значение от 1 до 7), реальная формула имеет вид:

(weekday  + @@DATEFIRST + 5) % 7 + 1

Ответ 2

Это сделает это.

SET DATEFIRST 1;

-- YOUR QUERY

Примеры

-- Sunday is first day of week
set datefirst 7; 
select DATEPART(dw,getdate()) as weekday


-- Monday is first day of week
set datefirst 1;
select DATEPART(dw,getdate()) as weekday

Ответ 3

Вы можете сказать, что SQL Server использует понедельник в качестве начала недели, используя DATEFIRST следующим образом:

SET DATEFIRST 1

Ответ 4

Я бы предположил, что вы просто напишете оператор case самостоятельно, используя datename():

select (case datename(dw, aws.date)
             when 'Monday' then 1
             when 'Tuesday' then 2
             when 'Wednesday' then 3
             when 'Thursday' then 4
             when 'Friday' then 5
             when 'Saturday' then 6
             when 'Sunday' then 7
        end)

По крайней мере, это не изменится, если кто-то изменит параметр в день недели, когда начнутся недели. С другой стороны, он восприимчив к языку, выбранному для SQL Server.

Ответ 5

Другим решением является следующее:

ISNULL(NULLIF(DATEPART(dw,DateField)-1,0),7)

Ответ 6

Я думаю, что это может сработать:

  select
    case when datepart(dw,[Date]) = 1 then 7 else DATEPART(DW,[Date])-1 end as WeekDay

Ответ 7

Это вызвано учетной записью, на которой запущена служба SQL Server. Например;

Если служба SQL Server выполняется под DOMAIN\MyUserAccount, тогда это должен быть вход и установка с соответствующим языком.

Если эта учетная запись не установлена, SQL Server по умолчанию будет использовать учетную запись sa и язык, который работает под.

Я обнаружил, что наша учетная запись sa была установлена на английский, который был в понедельник как DW = 2. Учетная запись DOMAIN\MyUserAccount была настроена и изменена на британский английский, а DW для понедельника возвращался как 1.

Надеюсь это поможет

Ответ 8

Попробуй это:

CREATE FUNCTION dbo.FnDAYSADDNOWK(
          @addDate AS DATE, 
          @numDays AS INT
       ) RETURNS DATETIME AS

    BEGIN
    WHILE @numDays > 0 BEGIN
        SET @addDate = DATEADD(day, 1, @addDate)    
        IF DATENAME(DW, @addDate) <> 'sunday' BEGIN
            SET @numDays = @numDays - 1 
        END
    END

    RETURN CAST(@addDate AS DATETIME)
END

Ответ 9

Похоже, настройки DATEFIRST - единственный способ, но невозможно сделать оператор SET в скалярной/табличной функции. Поэтому это становится очень подверженным ошибкам коллегам, следящим за вашим кодом. (стать ловушкой для других)

Фактически, функция datepart сервера SQL должна быть улучшена, чтобы вместо этого принимать это как параметр.

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

Ответ 11

я думаю

DATEPART(dw,ads.date - 1) as weekday 

должно сработать.