source

SQL Server 2005/2008 요일 가져오기

lovecheck 2023. 4. 7. 21:33
반응형

SQL Server 2005/2008 요일 가져오기

2009년 1월 1일의 날짜를 알고 싶습니다.월요일, 화요일...

SQL Server 2005/2008에는 이 기능을 내장하고 있습니까?아니면 보조 테이블을 사용해야 하나요?

또는 사용:

SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6

SQLMenace의 답변은 받아들여졌지만 중요한 것이 하나 있습니다.SET유의해야 할 옵션

날짜 우선 설정

아래 그림과 같이 요일이 변경된 경우 DATENAME은 올바른 날짜 이름을 반환하지만 동일한 DATEPART 값은 반환되지 않습니다.

declare @DefaultDateFirst int
set @DefaultDateFirst = @@datefirst
--; 7 First day of week is "Sunday" by default
select  [@DefaultDateFirst] = @DefaultDateFirst 
    
set datefirst @DefaultDateFirst
select datename(dw,getdate()) -- Saturday
select datepart(dw,getdate()) -- 7

--; Set the first day of week to * TUESDAY * 
--; (some people start their week on Tuesdays...)
set datefirst 2
select datename(dw,getdate()) -- Saturday
--; Returns 5 because Saturday is the 5th day since Tuesday.
--; Tue 1, Wed 2, Th 3, Fri 4, Sat 5
select datepart(dw,getdate()) -- 5 <-- It's not 7!
set datefirst @DefaultDateFirst
SELECT  CASE DATEPART(WEEKDAY,GETDATE())  
    WHEN 1 THEN 'SUNDAY' 
    WHEN 2 THEN 'MONDAY' 
    WHEN 3 THEN 'TUESDAY' 
    WHEN 4 THEN 'WEDNESDAY' 
    WHEN 5 THEN 'THURSDAY' 
    WHEN 6 THEN 'FRIDAY' 
    WHEN 7 THEN 'SATURDAY' 
END

유럽:

declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);

특정 날짜에 대한 요일의 결정론적 값을 얻으려면 DATEPART()와 @@datefirst조합을 사용합니다.그 이외의 경우는, 서버의 설정에 의존합니다.

보다 나은 솔루션에 대해서는, 다음의 사이트를 참조해 주세요.MS SQL : Day of Week

요일은 0 ~6 의 범위입니다(0은 일요일, 1은 월요일 등).그런 다음 간단한 대/소문자를 사용하여 올바른 평일 이름을 반환할 수 있습니다.

SQL Server 2012 이후에는FORMAT기능.

SELECT FORMAT(GETDATE(), 'dddd')

사용할 수 있습니다.DATEPART(dw, GETDATE())그러나 결과는 SQL Server 설정에 따라 달라집니다.@@DATEFIRST[value] : 요일의 첫 번째 설정(유럽에서는 디폴트값 7이 일요일)

첫 번째 요일을 다른 값으로 변경하려면SET DATEFIRST그러나 이는 쿼리 세션에서 원하지 않는 모든 부분에 영향을 미칠 수 있습니다.

대체 방법은 요일 값을 파라미터로 명시적으로 지정하고 에 의존하지 않도록 하는 것입니다.@@DATEFIRST설정.필요에 따라 다음 수식을 사용하여 이를 달성할 수 있습니다.

(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1

어디에@WeekStartDay사용하시는 시스템의 첫 번째 요일(1부터7까지, 즉 월요일부터 일요일까지)입니다.

아래 기능으로 포장하여 쉽게 재사용할 수 있습니다.

CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
    --Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
    RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1 
END

사용 예: GetDayInWeek('2019-02-04 00:00:00', 1)

이는 다음과 같습니다(단, SQL Server DATEFIRST 설정과는 독립적입니다).

SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')

이것은 내 코드의 작업 복사본이며, sql에서 날짜에서 날짜 이름을 검색하는 방법을 확인합니다.

CREATE Procedure [dbo].[proc_GetProjectDeploymentTimeSheetData] 
@FromDate date,
@ToDate date

As 
Begin
select p.ProjectName + ' ( ' + st.Time +' '+'-'+' '+et.Time +' )' as ProjectDeatils,
datename(dw,pts.StartDate) as 'Day'
from 
ProjectTimeSheet pts 
join Projects p on pts.ProjectID=p.ID 
join Timing st on pts.StartTimingId=st.Id
join Timing et on pts.EndTimingId=et.Id
where pts.StartDate >= @FromDate
and pts.StartDate <= @ToDate
END

의지하고 싶지 않다면@@DATEFIRST또는 사용DATEPART(weekday, DateColumn)요일을 직접 계산해 보세요.

월요일 기준 주(유럽)의 경우 가장 간단한 것은 다음과 같습니다.

SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay

일요일 기준 주(미국)의 경우:

SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay

1753년 1월 1일 이후 평일 번호(1~7)가 반환됩니다.

위의 답변과 더불어 dw는 Week Day를 나타냅니다.

SELECT DATENAME(WEEKDAY,GETDATE()) AS WeekDay

또는

SELECT DATENAME(W,GETDATE()) AS WeekDay

이 버전은 단축된 평일 이름을 한 줄로 반환할 때 유용할 수 있습니다.

-- Test DATA
select @@datefirst
create table #test (datum datetime)
insert #test values ('2013-01-01')
insert #test values ('2013-01-02')
insert #test values ('2013-01-03')
insert #test values ('2013-01-04')
insert #test values ('2013-01-05')
insert #test values ('2013-01-06')
insert #test values ('2013-01-07')
insert #test values ('2013-01-08')
-- Test DATA

select  Substring('Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun,Mon,Tue,Wed,Thu,Fri,Sat',
        (DATEPART(WEEKDAY,datum)+@@datefirst-1)*4+1,3),Datum
        from #test 

언급URL : https://stackoverflow.com/questions/1110998/get-day-of-week-in-sql-server-2005-2008

반응형