Oracle
 sql >> Base de données >  >> RDS >> Oracle

Obtenir des secondes entre deux horodatages Oracle

"Meilleures pratiques"

Quoi que vous fassiez, enveloppez-le dans une fonction, par ex. seconds_between (from_date, to_date) - peu importe comment il le fait (choisissez la méthode la plus efficace) - alors ce que fait votre code sera parfaitement évident.

Performances

J'ai testé les deux méthodes sur 11gR1 sur mon ordinateur portable (WinXP) avec le cas de test ci-dessous. Il semble que l'option CAST soit la plus rapide. (t1 est la ligne de base, t2 a utilisé l'extract méthode, t3 a utilisé le cast méthode)

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

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

Script de test

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;