신청가능한 시작날짜와 종료일을 가져오는 함수를 짜려고 하는데요.. 0 1 181

by 동글동글 [2018.01.08 13:40:24]


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 를 어찌 조건을 거어야 할 것 같은데

도움 좀 부탁드립니다 .... 

지난주부터 잡고있는데 안되네요 ㅜㅠ

by 마농 [2018.01.08 15:09:37]
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
;

 

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