특정 시작일에서 종료일 까지 기간에서 특정 요일의 날짜를 추출하는 쿼리 입니다.

잘 사용은 안하지만 이번에 사용할 일이 있어서 짜보았는데 음...

잘되는것 같아 포스팅 해보았습니다.

 

 

DECLARE @ReportDateFrom VARCHAR(10) = '2017-12-21'
DECLARE @ReportDateTo VARCHAR(10) = '2018-03-07'

 

DECLARE @DATEPART_FROM SMALLINT = DATEPART(DW, @ReportDateFrom);
DECLARE @DIFF_FROM SMALLINT;

DECLARE @DATEPART_TO SMALLINT = DATEPART(DW, @ReportDateTo);
DECLARE @DIFF_TO SMALLINT;

DECLARE @MIN SMALLINT = 1;
WHILE (@MIN <= 2)
BEGIN
  IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 1) -- 일요일
   IF (@MIN = 1) SET @DIFF_FROM = 4 ELSE SET @DIFF_TO = 4;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 2) -- 월요일
   IF (@MIN = 1) SET @DIFF_FROM = 3 ELSE SET @DIFF_TO = 3;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 3) -- 화요일
   IF (@MIN = 1) SET @DIFF_FROM = 2 ELSE SET @DIFF_TO = 2;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 4) -- 수요일
   IF (@MIN = 1) SET @DIFF_FROM = 1 ELSE SET @DIFF_TO = 1;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 5) -- 목요일
   IF (@MIN = 1) SET @DIFF_FROM = 0 ELSE SET @DIFF_TO = 0;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 6) -- 금요일
   IF (@MIN = 1) SET @DIFF_FROM = 6 ELSE SET @DIFF_TO = 6;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 7) -- 토요일
   IF (@MIN = 1) SET @DIFF_FROM = 5 ELSE SET @DIFF_TO = 5;

 SET @MIN = @MIN + 1;
END


SET @ReportDateFrom  = CONVERT(VARCHAR(10), DATEADD(D, @DIFF_FROM, @ReportDateFrom), 120) -- 시작일 해당주 목요일
SET @ReportDateTo  = CONVERT(VARCHAR(10), DATEADD(D, @DIFF_TO, @ReportDateTo), 120) -- 종료일 해당주 목요일

SELECT @ReportDateFrom, @ReportDateTo

WHILE (@ReportDateFrom <= @ReportDateTo)
BEGIN
 SELECT @ReportDateFrom

 SET @ReportDateFrom = CONVERT(VARCHAR(10), DATEADD(D, 7, @ReportDateFrom), 120);
END

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

ALTER TABLE (동적으로 테이블에 컬럼 추가)  (0) 2018.03.29
mssql 날짜 포맷 모음  (0) 2018.02.28
MSSQL 반올림, 자르기(절삭), 올림, 내림  (0) 2018.02.19
십단위 올림  (0) 2018.02.19
로우 합치기  (0) 2018.02.02

+ Recent posts

특정 시작일에서 종료일 까지 기간에서 특정 요일의 날짜를 추출하는 쿼리 입니다.

잘 사용은 안하지만 이번에 사용할 일이 있어서 짜보았는데 음...

잘되는것 같아 포스팅 해보았습니다.

 

 

DECLARE @ReportDateFrom VARCHAR(10) = '2017-12-21'
DECLARE @ReportDateTo VARCHAR(10) = '2018-03-07'

 

DECLARE @DATEPART_FROM SMALLINT = DATEPART(DW, @ReportDateFrom);
DECLARE @DIFF_FROM SMALLINT;

DECLARE @DATEPART_TO SMALLINT = DATEPART(DW, @ReportDateTo);
DECLARE @DIFF_TO SMALLINT;

DECLARE @MIN SMALLINT = 1;
WHILE (@MIN <= 2)
BEGIN
  IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 1) -- 일요일
   IF (@MIN = 1) SET @DIFF_FROM = 4 ELSE SET @DIFF_TO = 4;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 2) -- 월요일
   IF (@MIN = 1) SET @DIFF_FROM = 3 ELSE SET @DIFF_TO = 3;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 3) -- 화요일
   IF (@MIN = 1) SET @DIFF_FROM = 2 ELSE SET @DIFF_TO = 2;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 4) -- 수요일
   IF (@MIN = 1) SET @DIFF_FROM = 1 ELSE SET @DIFF_TO = 1;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 5) -- 목요일
   IF (@MIN = 1) SET @DIFF_FROM = 0 ELSE SET @DIFF_TO = 0;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 6) -- 금요일
   IF (@MIN = 1) SET @DIFF_FROM = 6 ELSE SET @DIFF_TO = 6;
  ELSE IF (CASE WHEN @MIN = 1 THEN @DATEPART_FROM ELSE @DATEPART_TO END = 7) -- 토요일
   IF (@MIN = 1) SET @DIFF_FROM = 5 ELSE SET @DIFF_TO = 5;

 SET @MIN = @MIN + 1;
END


SET @ReportDateFrom  = CONVERT(VARCHAR(10), DATEADD(D, @DIFF_FROM, @ReportDateFrom), 120) -- 시작일 해당주 목요일
SET @ReportDateTo  = CONVERT(VARCHAR(10), DATEADD(D, @DIFF_TO, @ReportDateTo), 120) -- 종료일 해당주 목요일

SELECT @ReportDateFrom, @ReportDateTo

WHILE (@ReportDateFrom <= @ReportDateTo)
BEGIN
 SELECT @ReportDateFrom

 SET @ReportDateFrom = CONVERT(VARCHAR(10), DATEADD(D, 7, @ReportDateFrom), 120);
END

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

ALTER TABLE (동적으로 테이블에 컬럼 추가)  (0) 2018.03.29
mssql 날짜 포맷 모음  (0) 2018.02.28
MSSQL 반올림, 자르기(절삭), 올림, 내림  (0) 2018.02.19
십단위 올림  (0) 2018.02.19
로우 합치기  (0) 2018.02.02

+ Recent posts