반응형

월요일을 주의 시작 요일로 설정을 하고..

 

해당 월 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월 결과를 뽑아보면 아래와 같이 나온다.

 

<끝>

반응형

+ Recent posts