programing

SQL DATEPART(dw, date)는 월요일 = 1 및 일요일 = 7이 필요합니다.

megabox 2023. 8. 2. 08:57
반응형

SQL DATEPART(dw, date)는 월요일 = 1 및 일요일 = 7이 필요합니다.

날짜의 요일을 가져오는 쿼리가 있지만 기본적으로 다음과 같습니다.

  • 일요일 = 1

  • 현대 = 2

  • 기타.

기능은 다음과 같습니다.

DATEPART(dw,ads.date) as weekday

결과가 필요합니다.

  • 일요일 = 7

  • 월요일 = 1

  • 기타.

이것을 할 수 있는 지름길이 있습니까?아니면 제가 해야 할 것입니다.CASE statement?

이걸로 충분해요.

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

다음과 같은 공식을 사용할 수 있습니다.

(weekday + 5) % 7 + 1

만약 여러분이 이것을 사용하기로 결정한다면, 이것이 실제로 여러분이 원하는 것을 한다는 것을 스스로에게 확신시키기 위해 몇 가지 예를 살펴볼 가치가 있을 것입니다.

추가: DATEFIRST 변수의 영향을 받지 않도록(1에서 7 사이의 값으로 설정할 수 있음) 실제 공식은 다음과 같습니다.

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

다음과 같이 DATEFIRST를 사용하여 SQL Server에 월요일을 한 주의 시작으로 사용하도록 지시할 수 있습니다.

SET DATEFIRST 1

저는 그냥 당신이 직접 사건 진술서를 작성하는 것을 제안하고 싶습니다.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에 대해 선택한 언어의 영향을 받기 쉽습니다.

이 공식은 다음과 상관없이 사용할 수 있습니다.DATEFIRST설정:

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - [first day that you need] ) % 7) + 1;

위해서monday = 1

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 1 ) % 7) + 1;

에 대해서도sunday = 1

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 7 ) % 7) + 1;

에 대해서도friday = 1

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 5 ) % 7) + 1;

또 다른 솔루션은 다음과 같습니다.

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

이 문제는 SQL Server 서비스가 실행되는 계정 때문에 발생합니다.예를 들어,

SQL Server 서비스가 DOMAIN\MyUserAccount에서 실행되는 경우 이 서비스는 로그인해야 하며 관련 언어로 설정되어야 합니다.

이 계정이 설정되지 않은 경우 SQL Server는 기본적으로 sa 계정 및 에서 실행되는 언어로 설정됩니다.

저는 우리의 sa 계정이 월요일이 DW = 2인 영어로 설정되어 있는 것을 발견했습니다.Domain\MyUser Account 계정이 설정되어 영국 영어로 변경되었으며 월요일 DW가 1로 반환되었습니다.

이것이 도움이 되길 바랍니다.

ads.date 필드에서 하루를 빼고 DATEPART 함수에 사용하기만 하면 됩니다.

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

효과가 있을 거라고 생각합니다.

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

사용해 보십시오.

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

DATEFIRST 설정이 유일한 방법인 것처럼 보이지만 스칼라/테이블 값 함수에서 SET 문을 만들 수 없습니다.따라서 코드를 따르는 동료들에게 오류가 발생하기 쉽습니다.(다른 사람들에게 덫을 씌웁니다)

사실 SQL server date part 기능은 이를 매개 변수로 사용할 수 있도록 개선되어야 합니다.

그 동안, 영어 이름을 사용하는 것이 가장 안전한 선택인 것 같습니다.

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

SQLChao 응답은 여전히 잘 작동합니다.

날짜를 먼저 설정해야 합니다.이 기사를 보세요.이것이 도움이 될 거라고 믿습니다.

https://learn.microsoft.com/en-us/sql/t-sql/statements/set-datefirst-transact-sql

생각합니다

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

효과가 있을 것입니다.

언급URL : https://stackoverflow.com/questions/24877124/sql-datepartdw-date-need-monday-1-and-sunday-7

반응형