sql >> Databasteknik >  >> RDS >> Oracle

Få sekunder mellan två Oracle-tidsstämplar

"Bästa tillvägagångssätt"

Vad du än gör, slå in det i en funktion, t.ex. seconds_between (from_date, to_date) - spelar ingen roll hur den gör det (välj den mest effektiva metoden) - då kommer det att vara helt uppenbart vad din kod gör.

Prestanda

Jag testade de två metoderna på 11gR1 på min bärbara dator (WinXP) med testfallet nedan. Det verkar som om CAST-alternativet är det snabbaste. (t1 är baslinjen, t2 använde extract metod, t3 använde cast metod)

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

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

Testskript

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;


  1. ORA-27154 / ORA-27146

  2. mysql-fråga för alla poster inte idag

  3. Kör dynamisk SQL-fråga i Oracle

  4. Hur mappar man Postgres _INT8 till Java-enhet med Hibernate?