sql >> Database >  >> RDS >> Oracle

Seconden krijgen tussen twee Oracle-tijdstempels

"Beste werkwijze"

Wat je ook doet, wikkel het in een functie, b.v. seconds_between (from_date, to_date) - maakt niet uit hoe het het doet (kies de meest efficiënte methode) - dan is het volkomen duidelijk wat uw code doet.

Prestaties

Ik heb de twee methoden getest op 11gR1 op mijn laptop (WinXP) met de onderstaande testcase. Het lijkt erop dat de CAST-optie de snelste is. (t1 is baseline, t2 gebruikte het extract methode, t3 gebruikte de cast methode)

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

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

Testscript

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. Ik moet gegevens ophalen op basis van de exacte volgorde in een array

  2. Multipliciteitsbeperking geschonden SQL Server 2008 - CodeFirst

  3. Inhuren of aangenomen worden:een gegevensmodel voor het wervingsproces

  4. Probleem met uitvoeringsprocedure in PL/SQL Developer