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
'programing' 카테고리의 다른 글
어떤 물체가 숫자인지 확인하는 가장 단순한 방법은 무엇입니까? (0) | 2023.08.02 |
---|---|
도커 작성 - 여러 명령을 실행하는 방법? (0) | 2023.08.02 |
Copy-Item은 디렉토리와 내용을 UNC 경로로 복사합니다. (0) | 2023.08.02 |
삭제_실패_APK를 설치하는 동안 INTERNAL_ERROR 오류가 발생했습니다. (0) | 2023.08.02 |
Oracle SQL Developer 쿼리 결과 내보내기 마법사 기본 출력 파일 이름 (0) | 2023.07.28 |