날짜가 2009 년 1 월 1 일인 경우 월요일, 화요일 등의 요일을 확인하고 싶습니다.
SQL Server 2005/2008에이 기능이 내장되어 있습니까? 아니면 보조 테이블을 사용해야합니까?
날짜가 2009 년 1 월 1 일인 경우 월요일, 화요일 등의 요일을 확인하고 싶습니다.
SQL Server 2005/2008에이 기능이 내장되어 있습니까? 아니면 보조 테이블을 사용해야합니까?
답변:
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
( @@datefirst - 1 + datepart(weekday, thedate) ) % 7
. 일요일은 항상 0입니다.
DayOfWeek
열거 DayOfWeek.Sunday
에 ...의 값이 있다는 것 0
입니다. 그래서 상관없이 DateFirst
에 잘 살고있다가, 치료 SQL-반환 WEEKDAY
값은 .NET 대응에 호환하지 않습니다. 예, 마이크로 소프트
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
select datename(dw,getdate())
특정 날짜의 요일에 대한 결정적 값을 얻으려면 DATEPART () 및 @@ datefirst 조합을 사용할 수 있습니다 . 그렇지 않으면 서버의 설정에 따라 다릅니다.
더 나은 솔루션을 얻으려면 다음 사이트를 확인하십시오. MS SQL : 요일
요일은 0-6 범위에 있으며, 여기서 0은 일요일, 1은 월요일 등입니다. 그런 다음 간단한 case 문을 사용하여 정확한 요일 이름을 반환 할 수 있습니다.
이것은 내 코드의 작업 복사본입니다 .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)를 반환합니다.
사용할 수는 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')
이 버전이 유용 할 수 있습니다.
-- 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