현재날짜에 가장근접한 날짜 구하기 0 3 13,898

by 트집이 [SQL Query] oracle query [2019.04.24 15:24:35]


안녕하세요. 고수님들.

아래와 같은 데이터가 있다고 가정했을 경우

현재날짜(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;

 

감사합니다.

by 소주쵝오 [2019.04.24 15:52:50]
select t_date
from (select t_date
           , c_date
           , c_time
           , abs(to_date(c_date||c_time, 'yyyymmdd hh24:mi:ss') - sysdate) diff
      from temp_t 
      order by diff
     )
where rownum <= 1
;

 


by 트집이 [2019.04.24 16:56:38]

제가 설명이 부족했네요. 현재시간에서 가장 가까운 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;


by 마농 [2019.04.26 08:42:33]
SELECT *
  FROM (SELECT *
          FROM temp_t
         WHERE c_date || c_time > TO_CHAR(sysdate, 'yyyymmddhh24miss')
--         AND c_date > TO_CHAR(sysdate, 'yyyymmdd') -- c_date 인덱스가 있다면 이 조건 추가
         ORDER BY diff
        )
 WHERE ROWNUM <= 1
;

 

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