안녕하세요. 고수님들.
아래와 같은 데이터가 있다고 가정했을 경우
현재날짜(C_DATE)와 현재시간(C_TIME)을 조건으로 가장 가까운(?) T_DATE를 구하고자합니다.
T_DATE C_DATE C_TIME
20190603 20190423 153000
20190604 20190424 060000
20190605 20190424 153000
20190606 20190425 153000
위 데이터 기준으로
만약 현재날짜와 시간이 20190424일 01시 라면 결과는 20190604
만약 현재날짜와 시간이 20190424일 13시 라면 결과는 20190605
가 나오면 됩니다.
아래와 같은 쿼리를 만들기는 했는데... 좀 더 간결하면서 고급스런(?) 방법이 없을까요?
WITH TEMP_T AS (
select '20190603' T_DATE, '20190423' C_DATE, '153000' C_TIME from dual
union all
select '20190604', '20190424', '060000' from dual
union all
select '20190605', '20190424', '153000' from dual
union all
select '20190606', '20190425', '153000' from dual
)
SELECT CASE
WHEN C_TIME > TO_CHAR(SYSDATE, 'HH24MISS') THEN T_DATE
ELSE (
SELECT T_DATE
FROM (
SELECT ROWNUM RN, T_DATE
FROM TEMP_T
WHERE C_DATE >= TO_CHAR(SYSDATE, 'YYYYMMDD')
ORDER BY
T_DATE ASC
)
WHERE RN = 2
)
END AS T_DATE
FROM (
SELECT ROWNUM RN, T_DATE, C_TIME
FROM TEMP_T
WHERE C_DATE >= TO_CHAR(SYSDATE, 'YYYYMMDD')
ORDER BY
T_DATE ASC
) A
WHERE RN = 1;
감사합니다.
제가 설명이 부족했네요. 현재시간에서 가장 가까운 t_date는 소주쵝오님이 구한 값이 맞습니다. 그런데 제가 구하고자 하는 값은 가장 가까운 미래의 값이 되어야 합니다. c_date || c_time의 값이 현재시간과 가장 가깝더라도 현재보다 과거이면 안 됩니다.
님 쿼리 도움 받아서 아래처럼 수정했네요. 감사합니다.
WITH TEMP_T AS (
select '20190603' T_DATE, '20190423' C_DATE, '153000' C_TIME from dual
union all
select '20190604', '20190424', '060000' from dual
union all
select '20190605', '20190424', '153000' from dual
union all
select '20190606', '20190425', '153000' from dual
)
select t_date
from (
select t_date
, c_date
, c_time
, to_date(c_date||c_time, 'yyyymmdd hh24:mi:ss') - to_date('20190424'||'070000', 'yyyymmdd hh24:mi:ss') diff
from temp_t
order by diff
)
where diff > 0
and rownum <= 1;