WITH DD(SEQ, NOTIC_STRT_YMD, NOTIC_END_YMD) AS ( SELECT '1', '20180201' ,'20180430' FROM DUAL UNION ALL --SELECT '2', '20180501' ,'20180731' FROM DUAL UNION ALL SELECT '3', '20180801' ,'20180930' FROM DUAL ) SELECT NVL(STRT_YMD,TO_DATE(:p_strt_ymd,'YYYYMMDD')) AS TT FROM ( /*MAX(게시종료일)보다 종료일이 클 경우 MAX(게시종료일)+1을 시작일로 RETURN */ SELECT CASE WHEN MAX(Z.NOTIC_END_YMD ) < :p_end_ymd THEN TO_DATE(MAX(Z.NOTIC_END_YMD ),'YYYYMMDD')+1 WHEN MAX(Z.NOTIC_END_YMD ) >= :p_end_ymd THEN CASE WHEN MIN(Z.NOTIC_STRT_YMD) > :p_strt_ymd THEN TO_DATE(:p_strt_ymd,'YYYYMMDD') WHEN MIN(Z.NOTIC_STRT_YMD) <= :p_strt_ymd THEN TO_DATE('99991231','YYYYMMDD') ELSE TO_DATE('99991201','YYYYMMDD') END END AS STRT_YMD FROM DD Z WHERE 1=1 AND Z.NOTIC_STRT_YMD <= :p_end_ymd AND Z.NOTIC_END_YMD >= :p_strt_ymd AND Z.NOTIC_END_YMD <= :p_end_ymd AND Z.NOTIC_STRT_YMD <= Z.NOTIC_END_YMD )
하고자 하는 것은 펑션에 검색시작 종료일(p_strt_ymd, p_end_ymd)을 파라미터로 보내면 신청가능한 시작일과 종료일을 리턴받고 싶습니다.
예를 들어, 위와 같이 2018/02/01 ~ 2018/04/30이 팔리고, 2018/08/01~2018/09/30이 팔렸을 경우
EX1)
p_strt_ymd = 2018/01/01
p_end_ymd = 2018/05/30 을 파라미터로 던졌을때
실제 구매가능한 기간은
2018/01/01~ 2018/01/31 과 2018/05/01~2018/05/30 로 2개이지만
뒤의 날짜를 리턴받고 싶고 (2018/05/01~2018/05/30)
EX2)
p_strt_ymd = 2018/04/01
p_end_ymd = 2018/09/01 을 파라미터로 던졌을때는
2018/05/01~ 2018/07/31 로 리턴받고싶습니다.
우선 시작일부터 작업한 후에 종료일을 작업해보려고 짜보긴했는데
시작일부터 막히네요...
위에 두 경우는 제대로 시작일을 가져오는데
p_strt_ymd = 2018/03/01
p_end_ymd = 2018/04/01 을 던졌을때
2018/03/01 로 가져옵니다... 이미 팔린날짜라 살 수 있는 시작일이 아닌데 말이죠..
그렇다고 AND Z.NOTIC_END_YMD <= :p_end_ymd 조건을 빼버리면
신청가능날짜가 2개있을때 뒤의 날짜를 못가져오게 되고
AND (Z.NOTIC_END_YMD <= :p_end_ymd OR Z.NOTIC_STRT_YMD 를 어찌 조건을 거어야 할 것 같은데
도움 좀 부탁드립니다 ....
지난주부터 잡고있는데 안되네요 ㅜㅠ
WITH dd(seq, notic_strt_ymd, notic_end_ymd) AS ( SELECT 1, '20180201', '20180430' FROM dual -- UNION ALL SELECT 2, '20180501', '20180731' FROM dual UNION ALL SELECT 3, '20180801', '20180930' FROM dual ) SELECT * FROM (SELECT NVL(MAX(CASE WHEN edt <= :p_end_ymd THEN edt END), :p_strt_ymd) sdt , NVL(MAX(CASE WHEN edt > :p_end_ymd THEN sdt END), :p_end_ymd ) edt FROM (SELECT TO_CHAR(TO_DATE(notic_strt_ymd, 'yyyymmdd') - 1, 'yyyymmdd') sdt , TO_CHAR(TO_DATE(notic_end_ymd , 'yyyymmdd') + 1, 'yyyymmdd') edt FROM dd WHERE notic_end_ymd >= :p_strt_ymd AND notic_strt_ymd <= :p_end_ymd ) ) WHERE sdt <= edt ;