안녕하세요.
날짜를 구하는 로직이 필요한데... 고수님들의 도움 부탁드립니다.
아래와 같은 데이터가 있다고 가정했을 경우...
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
;
감사합니다.
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 ;
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 ;