파라미터로 넘어오는 것은 특정시간 값이 넘어오구요
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
이 쿼리로 안되는건지요 ㅜㅜ
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 ;