반응형
월요일을 주의 시작 요일로 설정을 하고..
해당 월 1주 차, 2주 차, 3주 차, 4주 차, 5주 차, 6주 차별 시작일자 종료일자를 구하는 쿼리는 아래와 같다.
(6주 차까지 설정한 이유는 2020년 8월처럼 6주까지 있는 달이 있기 때문에..)
DECLARE @V_DT NVARCHAR(8) = '20201201' -- 기준년월
-- 각 주차별 시작일 종료일을 담을 변수
DECLARE @V_DT_START_FIRST NVARCHAR(8),
@V_DT_END_FIRST NVARCHAR(8),
@V_DT_START_SECOND NVARCHAR(8),
@V_DT_END_SECOND NVARCHAR(8),
@V_DT_START_THIRD NVARCHAR(8),
@V_DT_END_THIRD NVARCHAR(8),
@V_DT_START_FOURTH NVARCHAR(8),
@V_DT_END_FOURTH NVARCHAR(8),
@V_DT_START_FIFTH NVARCHAR(8),
@V_DT_END_FIFTH NVARCHAR(8),
@V_DT_START_SIXTH NVARCHAR(8),
@V_DT_END_SIXTH NVARCHAR(8)
-- 해당월 1일의 요일을 구한다.
DECLARE @V_DT_WEEK NVARCHAR(10) = DATENAME(WEEKDAY, @V_DT)
-- 월요일 기준일자 셋팅
-- 기준요일이 월요일이 아니라면 마지막 숫자를 바꿔주기
-- 일요일은:-1 / 월요일:0 / 화요일:1 / 수요일:2 / 목요일:3 / 금요일:4 / 토요일:5
DECLARE @V_STD_DATE DATE = DATEADD(WK, DATEDIFF(WK,0, DATEADD(DD,7 -DATEPART(DAY,@V_DT),@V_DT)), 0)
-- 1주차 시작일, 종료일
SET @V_DT_START_FIRST = @V_DT
SET @V_DT_END_FIRST = CONVERT(NVARCHAR(8), DATEADD(DAY, -1, @V_STD_DATE), 112) -- 월요일 기준일자 -1일
-- 2주차 시작일, 종료일
SET @V_DT_START_SECOND = CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FIRST), 112) -- 월요일 기준일자
SET @V_DT_END_SECOND = CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_SECOND), 112) -- 2주차 시작일의 6일 더하기
-- 3주차 시작일, 종료일
SET @V_DT_START_THIRD = CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_SECOND), 112) -- 2주차 종료일의 하루 더하기
SET @V_DT_END_THIRD = CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_THIRD), 112) -- 3주차 시작일의 6일 더하기
-- 2월도 셋팅해줘야함..
-- 4주차 시작일 종료일
SET @V_DT_START_FOURTH = CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_THIRD), 112) -- 3주차 종료일의 하루 더하기
SET @V_DT_END_FOURTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_FOURTH), 112),5,2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_FOURTH), 112)
END -- 4주차 시작일의 6일 더하기
-- 5주차 시작일 종료일
-- 5주차 시작일 종료일이 다음달로 넘어가면 해당월 마지막일자로 셋팅
SELECT @V_DT_START_FIFTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FOURTH), 112), 5, 2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FOURTH), 112)
END -- 4주차 종료일의 하루 더하기
SELECT @V_DT_END_FIFTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_FIFTH), 112), 5, 2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_FIFTH), 112)
END -- 5주차 시작일의 6일 더하기
-- 5주차 시작일이 4주차 종료일과 같으면 빈값으로 셋팅..(어짜피 5주차는 없으니까)
SELECT @V_DT_START_FIFTH = CASE WHEN @V_DT_END_FOURTH = @V_DT_START_FIFTH THEN '' ELSE @V_DT_START_FIFTH END
SELECT @V_DT_END_FIFTH = CASE WHEN @V_DT_END_FOURTH = @V_DT_END_FIFTH THEN '' ELSE @V_DT_END_FIFTH END
-- 6주차.. 진짜 간혹가다가 한번 있음(예를 들면 2020년8월)
SELECT @V_DT_START_SIXTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FIFTH), 112), 5, 2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FIFTH), 112)
END -- 5주차 종료일의 하루 더하기
SELECT @V_DT_END_SIXTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_SIXTH), 112), 5, 2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_SIXTH), 112)
END -- 6주차 시작일의 6일 더하기
-- 6주차 시작일이 5주차 종료일과 같으면 빈값으로 셋팅..(어짜피 6주차는 없으니까)
SELECT @V_DT_START_SIXTH = CASE WHEN @V_DT_END_FIFTH = @V_DT_START_SIXTH THEN '' ELSE @V_DT_START_SIXTH END
SELECT @V_DT_END_SIXTH = CASE WHEN @V_DT_END_FIFTH = @V_DT_END_SIXTH THEN '' ELSE @V_DT_END_SIXTH END
-- 결과
SELECT @V_DT_START_FIRST AS START_FIRST,
@V_DT_END_FIRST AS END_FIRST,
@V_DT_START_SECOND AS START_SECOND,
@V_DT_END_SECOND AS END_SECOND,
@V_DT_START_THIRD AS START_THIRD,
@V_DT_END_THIRD AS END_THIRD,
@V_DT_START_FOURTH AS START_FOURTH,
@V_DT_END_FOURTH AS END_FOURTH,
@V_DT_START_FIFTH AS START_FIFTH,
@V_DT_END_FIFTH AS END_FIFTH,
@V_DT_START_SIXTH AS START_SIXTH,
@V_DT_END_SIXTH AS END_SIXTH
2020년 12월 결과를 뽑아보면 아래와 같이 나온다.
<끝>
반응형
'Database > MS-SQL' 카테고리의 다른 글
[MSSQL] 기존 테이블에 PK 추가하기 (4) | 2021.03.25 |
---|---|
[MS-SQL] Column Add & Delete & Modify (6) | 2021.03.08 |
[MS-SQL] 임시테이블 존재 확인방법 (4) | 2020.12.04 |