programing

두 Oracle 타임스탬프 간의 간격(초)

batch 2023. 6. 30. 22:13
반응형

두 Oracle 타임스탬프 간의 간격(초)

Tom Kyte는 차이를 얻기 위해 사용할 것을 제안합니다.

extract( day from (x-y) )*24*60*60+
extract( hour from (x-y) )*60*60+
...

이것은 읽기 어렵고 속도가 느린 것으로 보입니다. 예:

( CAST( x AS DATE ) - CAST( y AS DATE ) ) * 86400

그렇다면, 두 타임스탬프의 차이를 초 단위로 얻는 방법은 무엇일까요?감사합니다!

"모범 사례"

당신이 무엇을 하든지, 예를 들어, 그것을 함수로 포장하세요.seconds_between (from_date, to_date)가장 효율적인 방법을 선택하십시오. 그러면 코드가 무엇을 하고 있는지 완전히 알 수 있습니다.

성능

아래 테스트 케이스로 노트북(WinXP)에서 11gR1에 두 가지 방법을 테스트했습니다.CAST 옵션이 가장 빠른 것 같습니다.(t1은 기준선이고, t2는 다음과 같이 사용됨)extract방법, t3 사용된cast방법)

t1 (nothing) 3
t2 (extract) 338
t3 (cast)    101

t1 (nothing) 3
t2 (extract) 336
t3 (cast)    100

테스트 스크립트

declare
 x TIMESTAMP := SYSTIMESTAMP;
 y TIMESTAMP := TRUNC(SYSDATE);
 n PLS_INTEGER;
 lc CONSTANT PLS_INTEGER := 1000000;
 t1 PLS_INTEGER;
 t2 PLS_INTEGER;
 t3 PLS_INTEGER;
begin
 t1 := DBMS_UTILITY.get_time;
 for i in 1..lc loop
  n := i;
 end loop;
 t1 := DBMS_UTILITY.get_time - t1;
 t2 := DBMS_UTILITY.get_time;
 for i in 1..lc loop
  n := extract(day from (x-y))*24*60*60
     + extract(hour from (x-y))*60*60
     + extract(minute from (x-y))*60
     + extract(second from (x-y));
 end loop;
 t2 := DBMS_UTILITY.get_time - t2;
 t3 := DBMS_UTILITY.get_time;
 for i in 1..lc loop
  n := ( CAST( x AS DATE ) - CAST( y AS DATE ) ) * 86400;
 end loop;
 t3 := DBMS_UTILITY.get_time - t3;
 dbms_output.put_line('t1 (nothing) ' || t1);
 dbms_output.put_line('t2 (extract) ' || t2);
 dbms_output.put_line('t3 (cast)    ' || t3);
end;

대안:
저는 이것이 밀리초를 포함한 몇 초 안에 차이를 얻는 데에도 효과가 있다는 것을 발견했습니다.
추출 방법에 문제가 있는 동안 "일광 절약"으로 시간대에 대해서도 절약할 수 있습니다.안타깝게도 t1과 t2의 차이는 결과가 옳기에 제한적입니다.초 단위가 손실되기 때문에 타임스탬프를 날짜 형식으로 캐스팅할 수 없습니다.

select (sysdate + (t2 - t1)*1000 - sysdate) * 86.4 from 
(select  
    to_timestamp('2014-03-30 01:00:10.111','YYYY-MM-DD HH24:MI:SS.FF') at time zone 'MET' t1, 
    to_timestamp('2014-03-30 03:00:10.112','YYYY-MM-DD HH24:MI:SS.FF') at time zone 'MET' t2 
 from dual);

빠르고 쉽게 사용할 수 있습니다.

extract( day from(t2 - t1)*24*60*60)

예:

with dates as (
   select
        to_timestamp('2019-06-18 22:50:00', 'yyyy-mm-dd hh24:mi:ss') t1
      , to_timestamp('2019-06-19 00:00:38', 'yyyy-mm-dd hh24:mi:ss') t2
   from dual
)
select
    extract( day from(t2 - t1)*24*60*60) diff_in_seconds
from dates
;

출력:

DIFF_IN_SECONDS
---------------
            638

저는 항상 두 번째 방법을 사용했습니다. 즉, DATE(일수 차이, 부분적인 부분이 있음)와 시간, 분, 초 또는 무엇이든 제공하려는 요인에 대한 곱셈을 비교합니다.

저는 그것이 좋고 읽기 쉽다고 생각합니다.

개인적으로 다음을 발견했습니다.

extract(day from (x-y))*24*60*60 + ... + extract(second from (x-y))

...보다 목적이 명확한.

( CAST( x AS DATE ) - CAST( y AS DATE ) ) * 86400

몇 초 안에 차이를 얻을 수 있습니다.

톰의 방법은 몇 번의 키 입력이 더 필요하지만 의도는 분명합니다.

to_number(to_char(t2, 'yyyymmddhh24missff')) - to_number(to_char(t1, 'yyyymmddhh24missff'))

언급URL : https://stackoverflow.com/questions/3957909/getting-seconds-between-two-oracle-timestamps

반응형