시간 영역을 가져오려 하는데요 (기준은 n개입니다) 0 4 717

by 권오창 [SQL Query] [2019.10.30 10:04:28]


파라미터로 넘어오는 것은 특정시간 값이 넘어오구요

 

    SELECT   
        prev_time   

    INTO v_rtnRdKey  
    FROM   
    (   
        WITH TA AS    
        (   
            SELECT '23,05,11' AS cola FROM DUAL  --기준(순서가 05,11,23이 될 수도 있음)
        )   
        , TB AS   
        (   
            SELECT    
                TO_CHAR(TO_DATE('20191030020000', 'YYYYMMDDHH24MISS'), 'HH24') AS cur_time
            FROM DUAL   
        )   
        SELECT   
            cola   
            , lv   
            , REGEXP_SUBSTR(cola, '[^,]+', 1, lv) AS split_time   
            , cur_time   
            , MAX(REGEXP_SUBSTR(cola, '[^,]+', 1, lv)) OVER() AS prev_time   
        FROM TA, TB   
        ,(   
            SELECT    
                level AS lv    
            FROM DUAL   
                , TA    
            CONNECT BY level <= REGEXP_COUNT(cola, ',') + 1    
        )   
        WHERE 1 = 1    
            AND REGEXP_SUBSTR(cola, '[^,]+', 1, lv) <= cur_time   
        
    )   
    WHERE split_time = prev_time   
    ;   

 

쿼리 보면 기준에 대한 데이터를 가져오구요 05,11,23 이런식으로요 그리고 넘겨받은 파라미터로는 특정시간의 DATE타입이 넘어옵니다.

넘겨 받은 시간이 05,11,23시의 기준으로 잡힙니다.

만약 20191030020000 는 02시니깐 05시보다 이전인 23시가 되는거구요 07시면 05시가,  18시면 11시가, 즉 넘어서지 않는 그전 시간대를 가져오는

건데요

 

제가 하고 싶은 것은 파라미터로 날짜를 받구요 저 기준 시간영역대에 시간을 뽑아 올려고 하는겁니다.

리턴은 YYYYMMDD와 HH의 문자를 OUTPUT으로 보내는거구요

 

그런데 예시에서 처럼 02시면 기준은 23시가 되어야 되고 년월일은 하루전으로 되어야 되거든요

ex)  20191030020000 ---> 함수 ===> 20191029  23

ex)  20191030090000 ---> 함수 ===> 20191030  05

ex)  20191030180000 ---> 함수 ===> 20191030  11

 

이 쿼리로 안되는건지요 ㅜㅜ

by 마농 [2019.10.30 10:18:58]

기준시는 항상 3개 인가요?


by 권오창 [2019.10.30 10:19:38]

아니요 기준은 4개가 될 수도 있고 여러개가 될 수 도 있습니다

콤마(,)로 구분되구요. 그래서 정규식 써서 콤마로 분리 해서 처리하려 한 것입니다


by 마농 [2019.10.30 11:05:21]
WITH ta AS    
(   
SELECT '23,05,11' cola FROM dual
)
, tb AS
(   
SELECT TO_DATE('20191030020000', 'YYYYMMDDHH24MISS') cur_time FROM dual
--SELECT TO_DATE('20191030090000', 'YYYYMMDDHH24MISS') cur_time FROM dual
--SELECT TO_DATE('20191030180000', 'YYYYMMDDHH24MISS') cur_time FROM dual
)
SELECT cur_time
     , TO_CHAR(TRUNC(cur_time, 'hh') - (y - MAX(x)) / 24, 'yyyy-mm-dd hh24') z
  FROM (SELECT NVL(x, MAX(x) OVER() - 24) x
          FROM (SELECT TO_NUMBER(SUBSTR(cola, LEVEL*3-2, 2)) x
                  FROM ta
                 CONNECT BY LEVEL <= (LENGTH(cola)+1)/3 + 1
                )
        ) a
     , (SELECT cur_time
             , TO_CHAR(cur_time, 'hh24') y
          FROM tb
        ) b
 WHERE x < y
 GROUP BY cur_time, y
;

 


by 권오창 [2019.10.30 21:50:56]

너무 감사합니다 

어케 저렇게 나오는지 히야.... 알려주신거 너무 감사합니다. 쿼리 잘 분석해보겠습니다.

수년째 마농님의 답변들을 답습해보지만... 역시 마농님과 함께 일하면 그 시스템은 진짜 최적화는 짱일 듯 합니다

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