2014-07-22 10 views

Odpowiedz

23

Można użyć formuły jak:

(weekday + 5) % 7 + 1 

Jeśli zdecydujesz się korzystać z tego, że warto byłoby prowadzenie przez kilka przykładów, aby przekonać się, że rzeczywiście robi to, co chcesz.

+0

Próbowałem to: (DATEPART (dw, ads.date) +5) mod 7 + 1 jako powszedni, ale pojawia się błąd na mod. Może zamówienie jest nieprawidłowe. – VAAA

+0

Ah, SQL Server używa innej składni. Poprawiłem moją odpowiedź, aby użyć '%' zamiast 'mod'. –

+1

Podczas pracy z OP myślę, że może się zepsuć, jeśli zmieni się język użytkownika. – DavidG

37

To zrobi to.

SET DATEFIRST 1; 

-- YOUR QUERY 

Przykłady

-- 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 
+0

Również ładne podejście, ale pójdę na MOD. Wielkie dzięki – VAAA

8

Sugerowałbym, że po prostu napisać oświadczenie case samodzielnie za pomocą 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) 

Przynajmniej ta nie ulegnie zmianie, jeżeli ktoś zmienia parametr na dzień tygodnia, w którym rozpoczynają się tygodnie. Z drugiej strony jest on podatny na język wybrany dla SQL Server.

10

Można powiedzieć SQL Server do używania poniedziałek jako początek tygodnia używając DATEFIRST takiego:

SET DATEFIRST 1 
-3

myślę

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

będzie działać.

+0

To całkowicie błędne – FindOutIslamNow

0

myślę, że to może działać:

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

Innym rozwiązaniem jest użycie następujących:

ISNULL(NULLIF(DATEPART(dw,DateField)-1,0),7) 
Powiązane problemy