본문 바로가기

Data

Oracle DB에서 주기적으로 데이터를 정확하게 5초 간격으로 추출

가령 스케줄러에서 5초 주기로 5초 전부터의 데이터를 가져오려고 한다고 해보자.

스케줄러 프로그램 실행 5초전 원하는 추출 시점
17:40:20 17:40:21 17:40:16 17:40:15
17:40:25 17:40:25 17:40:20 17:40:20
17:40:30 17:40:32 17:40:27 17:40:25

스케줄러에 등록된 프로그램 기동 시간 지연 등의 이유로 추출 기준시점이 틀어지는 문제를 예상해볼 수 있을 듯 하다. 

trunc 와 NUMTODSINTERVAL을 조합해서 만들어 본 꽁수.

SELECT sysdate, trunc(sysdate, 'MI'), 
   sysdate - INTERVAL '5' SECOND,
   trunc(sysdate, 'MI') + NUMTODSINTERVAL(floor(to_char(sysdate, 'SS') / 5) * 5 - 5, 'SECOND') t
FROM dual;
  • NUMTODSINTERVAL - Converts a number or expression to an INTERVAL DAY TO SECOND type.

이전에 [MySQL]시간 올림, 내림에서 썼던 방식대신 여기서 사용한 방식을 mySQL에서 응용한다면 이런 식으로 하면 될 듯.

SELECT NOW(), FROM_UNIXTIME((UNIX_TIMESTAMP(NOW()) DIV 60) * 60) + INTERVAL FLOOR(SECOND(NOW()) / 5) * 5 - 5 SECOND AS t2