티스토리 뷰
반응형
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 |
---|
댓글