기본 데이터가
WITH T AS
(
SELECT 'A' CAR, TO_DATE('20110801'||'2000', 'YYYYMMDDHH24MI') SDT, TO_DATE('20110802'||'0000', 'YYYYMMDDHH24MI') EDT FROM dual
UNION
SELECT 'B' CAR, TO_DATE('20110801'||'1000', 'YYYYMMDDHH24MI') SDT, TO_DATE('20110801'||'1300', 'YYYYMMDDHH24MI') EDT FROM dual
UNION
SELECT 'C' CAR, TO_DATE('20110801'||'1400', 'YYYYMMDDHH24MI') SDT, TO_DATE('20110801'||'1700', 'YYYYMMDDHH24MI') EDT FROM dual
UNION
SELECT 'C' CAR, TO_DATE('20110802'||'0800', 'YYYYMMDDHH24MI') SDT, TO_DATE('20110802'||'1000', 'YYYYMMDDHH24MI') EDT FROM dual
), COPY_T AS
(SELECT TO_DATE('20110801'||'0000','yyyymmddhh24mi') + (LEVEL - 1) /24/6 AS BASIS_DT
FROM DUAL
CONNECT BY LEVEL <= (SELECT (TO_DATE('20110802'||'1800','yyyymmddhh24mi') - TO_DATE('20110801'||'1200','yyyymmddhh24mi')) * 24 * 6 +1 FROM DUAL)
)
이렇게 존재할 경우에...
정해진 FROM ~ TO ('20110801'||'1200' ~ '20110802'||'1800' )에 차량별 예약시간이 비어있는 시간을 뽑기위한 방법입니다.
단 앞차량의 이용전후로 1시간은 이용할 수 없구여..
예상 결과
A 201108011200 ~201108011900
A 201108020100 ~ 201108021800
B 201108011400 ~ 201108021800
C 201108011200 ~ 201108011300
C 201108011800 ~ 201108020700
C 201108021100 ~ 201108021800
이런식으로 데이터를 추출할려고 하는데여.. 여러 고수님들의 고견 부탁드립니다.
######################################################################################
기준일자 : '201108010110' ~ '201108030110'를 기준으로 사용할수 있는 시간대의 자동차 내역 추출...
더 좋은 방법있으시면 알려주시면 감사하겠습니다.
WITH T AS
(
SELECT 'A' CAR, TO_DATE('20110801'||'2000', 'YYYYMMDDHH24MI') SDT, TO_DATE('20110802'||'0000', 'YYYYMMDDHH24MI') EDT FROM dual
UNION
SELECT 'B' CAR, TO_DATE('20110801'||'1000', 'YYYYMMDDHH24MI') SDT, TO_DATE('20110801'||'1310', 'YYYYMMDDHH24MI') EDT FROM dual
UNION
SELECT 'C' CAR, TO_DATE('20110801'||'1430', 'YYYYMMDDHH24MI') SDT, TO_DATE('20110801'||'1700', 'YYYYMMDDHH24MI') EDT FROM dual
UNION
SELECT 'C' CAR, TO_DATE('20110802'||'0850', 'YYYYMMDDHH24MI') SDT, TO_DATE('20110802'||'1000', 'YYYYMMDDHH24MI') EDT FROM dual
)
SELECT DISTINCT CAR, FROM_DT, TO_DT, BETWEEN_TM
FROM (
--CAR 기준으로 후 데이터
SELECT CAR
, FROM_DT
, TO_DT
, CASE WHEN CEIL((TO_DT - FROM_DT) * 24)<3
THEN 3
ELSE CEIL((TO_DT - FROM_DT) *24) END AS BETWEEN_TM
FROM( SELECT CAR
, EDT + 1/24 AS FROM_DT
, NVL(LEAD(SDT - 1/24) OVER(PARTITION BY CAR ORDER BY CAR, EDT ASC), TO_DATE('201108030110', 'YYYYMMDDHH24MI')) AS TO_DT
FROM T
)
UNION ALL
--CAR 기준으로 앞 데이터
SELECT CAR
, FROM_DT
, TO_DT
, CASE WHEN CEIL((TO_DT - FROM_DT) * 24)<3
THEN 3
ELSE CEIL((TO_DT - FROM_DT) *24) END AS BETWEEN_TM
FROM( SELECT CAR
, NVL(LAG(EDT + 1/24) OVER(PARTITION BY CAR ORDER BY CAR, SDT ASC), TO_DATE('201108010110', 'YYYYMMDDHH24MI')) AS FROM_DT
, SDT - 1/24 AS TO_DT
FROM T
)
) ORDER BY CAR, FROM_DT, TO_DT |