요일을 이용한 날짜 구하기 0 2 3,456

by 트집이 [SQL Query] oracle query [2019.04.19 13:24:35]


안녕하세요.

 

날짜를 구하는 로직이 필요한데... 고수님들의 도움 부탁드립니다.

아래와 같은 데이터가 있다고 가정했을 경우...

day_of_week는 요일일 의미합니다. (1:일, 2:월, 3:화, 4:수, 5:목, 6:금, 7:토)

target_day의 요일이 day_of_week에 속하면 그냥 그 날짜가 최종 목표날짜가 됩니다.

그런데 target_day의 요일이 해당 day_of_week에 없다면 최종날짜는 가장 가까운 미래의 요일에 해당하는 날짜가 최종 목표날짜가 됩니다.

이 로직은 쿼리로 만들어서 해결 할 수가 있을까요?

한방 쿼리가 안 되면 function으로 만들어야 할 것 같아요.

 

아래와 같은 데이터의 최종 목표날짜는 둘다 '20190409'이 되면 되겠네요.

                                   select '3,4,5' as day_of_week
                                        , '20190405' as target_day
                                   from dual
                                   union all
                                   select '1,3,5' as day_of_week
                                        , '20190408' as target_day
                                   from dual                                    
                                   ;  

 

감사합니다.

by 색즉시공 [2019.04.19 23:30:33]
WITH
TBL AS (
select '3,4,5' as day_of_week
     , '20190405' as target_day
from dual
union all
select '1,3,5' as day_of_week
     , '20190408' as target_day
from dual                                    
)

SELECT day_of_week
      ,target_day
      ,CASE WHEN INSTR(day_of_week,TO_CHAR(TO_DATE(target_day,'YYYYMMDD'),'D'))>0
            THEN target_day
            ELSE ( 
                SELECT SUBSTR(LISTAGG(TO_CHAR(TO_DATE(target_day,'YYYYMMDD') + LEVEL
                              ,'YYYYMMDD'),',') WITHIN GROUP(ORDER BY LEVEL),1,8)
                  FROM DUAL
                 WHERE INSTR(day_of_week,TO_CHAR(TO_DATE(target_day,'YYYYMMDD') + LEVEL,'D'))>0
                CONNECT BY LEVEL <=7
                ) END LAST_DAY
  FROM TBL
;  

 


by 마농 [2019.04.22 08:58:47]
WITH tbl AS
(
SELECT 1 pk, '3,4,5' day_of_week, '20190405' target_day FROM dual
UNION ALL SELECT 2, '1,3,5', '20190408' FROM dual
)
SELECT a.pk
     , a.day_of_week
     , a.target_day
     , TO_CHAR(MIN(NEXT_DAY(TO_DATE(target_day, 'yyyymmdd') - 1, b.lv)), 'yyyymmdd') dt
  FROM tbl a
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 7) b
 WHERE INSTR(a.day_of_week, b.lv) > 0
 GROUP BY a.pk, a.day_of_week, a.target_day
;

 

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