영업일 기준 일정 미루기 1 2 5,224

by 천사원이 [SQL Query] [2024.04.05 11:37:00]


IMG_2960.png (182,317Bytes)
IMG_2961.png (206,847Bytes)
IMG_2962.png (134,177Bytes)

MSSQL사용하고 있습니다.

영업일 기준으로 일정을 미루는 쿼리를 만들고 있는데, 일정내 주말이 2번 이상인 경우 자료가 맞지 않아 도움 받고자 합니다ㅜㅜ

예시) 2일을 미룬다는 가정

         원래일자:20240425

         변경일자:20240429

이런식으로 주말을 건너뛰고 영업일 기준으로만

일정을 미루고 싶습니다.

원본 데이터에 주차를 기준으로 해서 커서를 돌리니 첫 주말 까지는 맞추었는데... 주말이 한번 더 오는 경우가 잘 안풀리네요.

by 아발란체 [2024.04.09 15:45:49]
BEGIN
    DECLARE @tday VARCHAR(MAX) = DATEADD(DAY, 2, '2024-04-25');
	SELECT
		CASE(DATEPART(WEEKDAY, @tday))
			WHEN 1 THEN DATEADD(day, 2, @tday)
			WHEN 7 THEN DATEADD(day, 2, @tday)
			ELSE @tday
		END
END

 


by 마농 [2024.04.11 10:29:49]
WITH calendar AS
(
-- 달력 테이블을 미리 생성해 두고 사용하시면 편리합니다.
-- 주말 뿐 아니라 공휴일 관리도 가능합니다.
SELECT FORMAT(DATEADD(DAY, 0, '20240422'), 'yyyyMMdd') v_dt
     , DATEADD(DAY, 0, '20240422') d_dt
     , DATEPART(WEEKDAY, DATEADD(DAY, 0, '20240422')) w_dy
 UNION ALL
SELECT FORMAT(DATEADD(DAY, 1, d_dt), 'yyyyMMdd') v_dt
     , DATEADD(DAY, 1, d_dt) d_dt
     , DATEPART(WEEKDAY, DATEADD(DAY, 1, d_dt)) w_dy
  FROM calendar
 WHERE v_dt < '20240517'
)
, DailyProdPlan AS
(
SELECT '20240424' SrtDate, '20240424' EndDate
UNION ALL SELECT '20240424', '20240425'
UNION ALL SELECT '20240425', '20240425'
UNION ALL SELECT '20240425', '20240426'
UNION ALL SELECT '20240426', '20240426'
UNION ALL SELECT '20240426', '20240427'
UNION ALL SELECT '20240427', '20240427'
UNION ALL SELECT '20240427', '20240428'
UNION ALL SELECT '20240428', '20240428'
UNION ALL SELECT '20240428', '20240429'
UNION ALL SELECT '20240429', '20240429'
UNION ALL SELECT '20240430', '20240430'
UNION ALL SELECT '20240430', '20240501'
UNION ALL SELECT '20240501', '20240502'
UNION ALL SELECT '20240502', '20240502'
UNION ALL SELECT '20240503', '20240503'
UNION ALL SELECT '20240503', '20240504'
UNION ALL SELECT '20240504', '20240505'
)
, tmp AS
(
SELECT a.v_dt old_dt
     , b.v_dt new_dt
  FROM (SELECT v_dt
             , ROW_NUMBER() OVER(ORDER BY v_dt) rn
          FROM (SELECT MIN(SrtDate) SrtDate
                     , MAX(EndDate) EndDate
                  FROM DailyProdPlan
                ) a
         INNER JOIN calendar c
            ON c.v_dt BETWEEN a.SrtDate AND a.EndDate
        ) a
 INNER JOIN
       (SELECT v_dt
             , ROW_NUMBER() OVER(ORDER BY v_dt) rn
          FROM (SELECT DATEADD(DAY,  2, MIN(SrtDate)) SrtDate
                     , DATEADD(DAY, 20, MAX(EndDate)) EndDate
                  FROM DailyProdPlan
                ) a
         INNER JOIN calendar c
            ON c.v_dt BETWEEN a.SrtDate AND a.EndDate
         WHERE c.w_dy NOT IN (1, 7)
        ) b
    ON a.rn = b.rn
)
SELECT a.SrtDate
     , a.EndDate
     , b.new_dt New_SrtDate
     , c.new_dt New_EndDate
  FROM DailyProdPlan a
 INNER JOIN tmp b
    ON a.SrtDate = b.old_dt
 INNER JOIN tmp c
    ON a.EndDate = c.old_dt
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입