티스토리 뷰

반응형

 

 

 

 



 

 

microsoftsqlserver

 

 

 

MS-SQL 에서 일별 데이터를 주차별로 group by 해서 추출할때 

select DATEPART(WEEK, 날짜)
	...
from 테이블
	...
group by DATEPART(WEEK, 날짜)

 

이런식으로 n주차를 그룹핑 할 수 있는데

MS-SQL의  @@DATEFIRST 설정값에 따라 주차를 묶는 범위가 정해진다.

 

select @@DATEFIRST

 

아마 따로 설정하지 않았으면 위 쿼리를 조회해보면 7 이 조회 될 건데

7은 일요일을 뜻한다.

 

고로 DATEPART(WEEK) 로 묶으면  일~토 가  1주차로 잡히게 된다.

 

 

 

근데 사용자에 따라 주차를  일-토 로 조회할 수도 있고

월-일 로 조회할 수도 있다.

뭐 상황에 따라서  다르게 조회 할 수도 있고...

 

 

일 데이터를 통째로 가져와서 스크립트에서 가공할까 했으나

쿼리에서 가져오는 것 까지만 주별로 묶어서 가져 오고 싶어서 

동적으로 시작요일을 변경해서 가져오는 함수를 작성했다.

 

 

 

 

 

 


 

날짜값과 시작요일을 지정하여  주차를 리턴받는 함수를 아래와 같이 작성했다.

ALTER FUNCTION [dbo].[fnGetWeekNumber]
(
	-- @StartDayOfWeek 는 select @@DATEFIRST 설정에 따라서 달라짐
	-- : @@DATEFIRST 가 디폴트로  7 인데  7은 일요일임
	-- : @@DATEFIRST 가 일요일이면  @StartDayOfWeek 의 1의 값은 일요일임

	@InputDate DATE,
	@StartDayOfWeek int
)
RETURNS INT
AS
BEGIN
	
	DECLARE @WeekNumber INT;
	DECLARE @FirstDayOfWeek INT;
	DECLARE @DaysToAdd INT;

	-- 주의 시작 요일 설정
	SET @FirstDayOfWeek = @StartDayOfWeek;

	-- 시작 요일에 따른 주차 마지막 요일 계산 값
	set @DaysToAdd = (@FirstDayOfWeek - DATEPART(WEEKDAY, @InputDate) + 6) % 7;

	-- 마지막 주차를 기준으로 하는 n주차
	SET @WeekNumber = DATEPART(WEEK, DATEADD(DAY, @DaysToAdd, @InputDate));

	RETURN @WeekNumber

END

 

@@DATEFIRST 에 따라서  시작요일 값이 달라지는데

@@DATEFIRST 값이 일요일이면 1은 일요일로 시작한다.

 

그래서 내가 월-일로 조회하고 싶다면  인자값을 2로 전달하면 된다.

 

시작요일로 부터 현재 요일값을 뺀 값에 6일을 더한 값은 주차의 마지막 요일까지 남은 값이고

이를 가지고 주차의 값을 구해 리턴해준다.

 

 

select [dbo].[fnGetWeekNumber](날짜컬럼, 2) as week
  ...
from 테이블
  ...
group by [dbo].[fnGetWeekNumber](날짜컬럼, 2)

 

 

기존에 스크립트로 동적 처리하던 코드부분을 많이 걷어 낼 수 있게 됐다.

 

 

 

 



 

 

반응형

'Database > MSSQL' 카테고리의 다른 글

[MSSQL] TABLE(테이블) 정의서 작성 쿼리  (0) 2023.01.05
댓글
반응형
최근에 올라온 글
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Total
Today
Yesterday