날짜 테이블에서 휴일 관련 질문 있습니다. 0 6 2,015

by 악어새 [Oracle 기초] 날짜 휴일계산 [2019.03.15 11:10:23]


양력날짜 음력날짜 요일 휴일며칠전인지 휴일며칠후인지
19000129 18991229 월요일 2 1
19000130 18991230 화요일 1 2
19000131 19000101 수요일 3 3
19000201 19000102 목요일 2 1
.. .. .. .. ..
.. .. .. .. ..
.. .. .. .. ..
.. .. .. .. ..
.. .. .. .. ..

안녕하세요. 날짜 테이블에 컬럼을 추가하던 중에 어려운 점이 생겨서 질문 드립니다

빨간색으로 칠한 컬럼을 추가하고 싶은데요,

( 음력날짜가 1월 1일이면 설날이라 휴일로 취급하여 양력날짜로 19000130은 휴일 1일전 으로 됩니다 )

다음 휴일로부터 며칠 전인지와, 이전 휴일로부터 며칠 후 인지를 저장하고 싶습니다.

여기서 휴일은 토요일과 일요일, 음력 날짜로 설날과 추석 입니다.

휴일 테이블은 따로 있고 휴일이면 Y, 아니면 N 이 저장되어있습니다.

여기서 휴일 테이블을 참고하여 휴일 며칠 전인지 며칠 후인지를 계산하고 싶은데 찾아보니 LAG 와 LEAD 함수를 사용해야 할 것 같은데요,

단순히 한번, 두번 이전의 데이터를 참고하는 것이 아니라 다음 휴일이 Y인 곳 까지의 count와, 이전 휴일이 Y인 곳 까지의 count를 관리하여

저장하여야 할 것 같은데, 이 방법을 모르겠습니다...

많은 도움 부탁드립니다 ㅠㅠ

by 우리집아찌 [2019.03.15 11:41:10]

1. 휴일 테이블은 전체 날짜가 들어있나요?

2. 휴일 몇일전에 설날에는 데이타가 3이 왜들어있나요? 뒤로가면 줄고... 휴일수인가요?

3. 휴일 몇일후는 데이터가 맞나요? 

 


by 악어새 [2019.03.15 11:44:59]

1. 휴일 테이블은 전체 날짜가 들어있나요?

     -> 네 일단 2054년까지 날짜가 들어있습니다.

2. 휴일 몇일전에 설날에는 데이타가 3이 왜들어있나요? 뒤로가면 줄고... 휴일수인가요?

     -> 설날의 휴일며칠전 컬럼에 3이있는 이유는 휴일로부터 3일 전 이라서 그렇습니다. 토요일이 휴일이기 때문에 토요일로부터 3일 전이라 3이 들어가 있습니다 설명이 부족했네요 죄송합니다.

3. 휴일 몇일후는 데이터가 맞나요? 

    -> 19000201 날짜의 데이터가 잘못들어가있네요 지적 감사합니다. 설날 다음날이므로 1이 되어야 합니다.


by 우리집아찌 [2019.03.15 11:48:59]

2. 휴일 몇일전에 설날에는 데이타가 3이 왜들어있나요? 뒤로가면 줄고... 휴일수인가요?

     -> 설날의 휴일며칠전 컬럼에 3이있는 이유는 휴일로부터 3일 전 이라서 그렇습니다. 토요일이 휴일이기 때문에 토요일로부터 3일 전이라 3이 들어가 있습니다 설명이 부족했네요 죄송합니다.

     -> 음력 1월1일이면 설날인데 3이 맞나요?


by 악어새 [2019.03.15 13:02:50]

넵 설날 휴일 당일에도 가장 가까운 휴일인 토요일로부터 3일 전이기 때문에 3이 들어가는 것이 맞습니다.


by 우리집아찌 [2019.03.15 15:25:20]
-- 오늘따라 바빠서 일단 휴가 몇일전인지

WITH CALENDAR (SUN_DT,MOON_DT) AS (
SELECT '19000129' , '18991229' FROM DUAL UNION ALL
SELECT '19000130' , '18991230' FROM DUAL UNION ALL
SELECT '19000131' , '19000101' FROM DUAL UNION ALL
SELECT '19000201' , '19000102' FROM DUAL UNION ALL
SELECT '19000202' , '19000103' FROM DUAL UNION ALL
SELECT '19000203' , '19000105' FROM DUAL UNION ALL
SELECT '19000204' , '19000106' FROM DUAL 
) , HOLIDAY ( SUN_DT , HOLIDAY_YN ) AS (
SELECT '19000131' , 'Y' FROM DUAL
)

SELECT SUN_DT 
     , MOON_DT
     , DY
     , COUNT(*) OVER(PARTITION BY GB ORDER BY SUN_DT DESC ) BF_HOLIDAY_CNT
  FROM (SELECT A.SUN_DT 
             , A.MOON_DT 
             , TO_CHAR(TO_DATE(A.SUN_DT,'YYYYMMDD'),'DAY') DY  
             , SUM(1+CASE WHEN TO_CHAR(TO_DATE(A.SUN_DT,'YYYYMMDD'),'D') IN ( 1 , 7 ) THEN 1 WHEN B.HOLIDAY_YN = 'Y' THEN 1 END ) OVER(ORDER BY A.SUN_DT) GB
             , ROW_NUMBER() OVER(ORDER BY A.SUN_DT) RN
          FROM CALENDAR A
             , HOLIDAY B
         WHERE A.SUN_DT = B.SUN_DT(+)
        )
  ORDER BY SUN_DT

 


by 악어새 [2019.03.15 16:39:36]

감사합니다 !!!!

생각하지 못한 새로운 방법이고 제가 모르는 부분이 있는 것 같아 공부해보겠습니다.

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