두 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
'programing' 카테고리의 다른 글
판다 데이터 프레임 열 헤더를 모두 소문자로 만들려면 어떻게 해야 합니까? (0) | 2023.06.30 |
---|---|
Oracle에서 'Buffer Gets'는 실제로 무엇을 의미합니까? (0) | 2023.06.30 |
Url.action()을 사용하여 동적 Javascript 값 전달 (0) | 2023.06.30 |
다중 처리:클래스에 정의된 함수에서 Pool.map을 사용하는 방법은 무엇입니까? (0) | 2023.06.30 |
mongodb 데이터베이스를 첫 번째 시스템을 볼 수 없는 다른 시스템으로 전송하려면 어떻게 해야 합니까? (0) | 2023.06.30 |