SQL Server 2005/2008에서 요일 가져 오기


369

날짜가 2009 년 1 월 1 일인 경우 월요일, 화요일 등의 요일을 확인하고 싶습니다.

SQL Server 2005/2008에이 기능이 내장되어 있습니까? 아니면 보조 테이블을 사용해야합니까?


1
날짜 부분에 대한 조회가 포함 된 테이블이있는 경우 일반적으로 잘못된 작업이 있습니다. SQL Server의 날짜 함수는 강력하고 강력하므로 날짜에서 추출해야하는 데이터는 날짜 시간 열에서 쉽게 수행 할 수 있습니다.
Benjamin Autin

6
보조 테이블은 날짜 계산에 매우 유용합니다. 달력 보조 테이블을 갖는 것은 드문 일이 아닙니다 ...

2
"날짜 계산에 유용"은 매우 모호합니다. 대부분의 날짜 계산은 보조 테이블없이 처리 할 수 ​​있으며 성능도 향상됩니다. 경우에 따라 일반 숫자 테이블이 실제 날짜가 포함 된 테이블이 필요없는 작업을 수행합니다. 실제 달력 테이블에 필요한 유일한 이유는 근무일이 규칙 인 규칙과 규칙이 복잡하지 않은 경우입니다. 내가 너무 자주 본 것은 날짜 테이블을 사용하는 사람들이 다른 방법으로 그것을 모르기 때문에 사람들입니다. 그런 다음 그들은 종종 날짜 테이블을 채워야합니다. 바보.
ErikE

5
1) 복잡한 휴일 / 근무일 규칙이 아니며 2) 내장 기능으로 쉽게 수행 할 수 없으며 3) 그렇지 않은 경우에만 # 2, 숫자 테이블은 마찬가지로 작동하며 특정 날짜로 테이블을 채울 필요가 없습니다.
ErikE

2
데이터웨어 하우스는 달력 테이블을 광범위하게 사용합니다. 사전 계산 된 월, 분기, 연도 등은 최종 사용자에게 필터링 / 집계 할 수있는 필드를 제공합니다.
David Rushton

답변:


694

사용 DATENAME또는 DATEPART:

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

thx, datename을 시도했지만 d를 사용하여 정수를 돌려주었습니다. dw는 예상대로 작동

39
그래서 select datename (weekday, getdate ())를 선호합니다. "weekday"를 대신 사용할 수있을 때 dw가 weekday를 반환한다는 것을 기억할 필요는 없습니다.
George Mastros

9
이 문제를 겪고있는 사람은 누구나 기본 요일이 일요일 입니다. 안전하게 바꾸는 방법에 대한
@Sung

2
@niico는 SQL이 1부터 색인하고 C와 같은 언어는 0부터 색인하기 때문에 발생합니다.
user824276

95

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

33
따라서 일정한 datepart 값을 얻으려면을 수행하십시오 ( @@datefirst - 1 + datepart(weekday, thedate) ) % 7. 일요일은 항상 0입니다.
Endy Tjahjono

1
끔찍한이 물건은 정적이므로 쿼리 원본을 따르고, 값을 변경하고, 쿼리를 실행하고, 원래 패턴을 재설정해야합니다.
JonnyRaa

2
이것의 재미있는 부분은 .NET의 DayOfWeek열거 DayOfWeek.Sunday에 ...의 값이 있다는 것 0입니다. 그래서 상관없이 DateFirst에 잘 살고있다가, 치료 SQL-반환 WEEKDAY값은 .NET 대응에 호환하지 않습니다. 예, 마이크로 소프트
Eric Wu

26
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

26
당신은 그것들을 달성하기 위해 내장 된 기능이라는 것을 알아야합니다. select datename(dw,getdate())
Soham Dasgupta

10
@SohamDasgupta이 내장 함수는 영어가 아닌 버전의 MS SQL에 대해 동일한 결과를 반환하지 않습니다.
Mr Scapegrace

12

특정 날짜의 요일에 대한 결정적 값을 얻으려면 DATEPART ()@@ datefirst 조합을 사용할 수 있습니다 . 그렇지 않으면 서버의 설정에 따라 다릅니다.

더 나은 솔루션을 얻으려면 다음 사이트를 확인하십시오. MS SQL : 요일

요일은 0-6 범위에 있으며, 여기서 0은 일요일, 1은 월요일 등입니다. 그런 다음 간단한 case 문을 사용하여 정확한 요일 이름을 반환 할 수 있습니다.


5
사람들이 링크를 클릭 할 필요가 없도록 답변에 답변을 입력하십시오.
Martin Smith

11

유럽:

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

2
코드의 기능과 질문에 대한 답변에 대한 설명을 포함하십시오. 답변으로 코드 스 니펫을 받으면 어떻게 해야할지 모를 수 있습니다. 답변은 OP 및 향후 방문자에게 문제를 디버깅하고 수정하는 방법에 대한 지침을 제공해야합니다. 코드의 기본 개념을 지적하면 문제를 이해하고 솔루션을 적용하거나 수정하는 데 크게 도움이됩니다.
Palec

6

SQL Server 2012 이상에서는이 FORMAT기능을 사용할 수 있습니다

SELECT FORMAT(GETDATE(), 'dddd')

3

이것은 내 코드의 작업 복사본입니다 .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

1

에 의존 @@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)를 반환합니다.


1

사용할 수는 DATEPART(dw, GETDATE())있지만 결과는 @@DATEFIRST첫 번째 요일 설정 인 SQL 서버 설정 값 (일요일 인 유럽 기본값 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')

0

이 버전이 유용 할 수 있습니다.

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

1
이것은
명백한
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.