In Oracle 10g habe ich eine Tabelle, die Zeitstempel enthält, die zeigen, wie lange bestimmte Operationen dauerte. Es hat zwei Zeitstempelfelder: Startzeit und Endzeit. Ich möchte Durchschnittswerte der von diesen Zeitstempeln angegebenen Dauer finden. Ich versuche:Wie durchschnittliche Zeitintervalle?
select avg(endtime-starttime) from timings;
aber erhalten:
SQL Error: ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND
Dies funktioniert:
select
avg(extract(second from endtime - starttime) +
extract (minute from endtime - starttime) * 60 +
extract (hour from endtime - starttime) * 3600) from timings;
Aber ist wirklich langsam.
Gibt es eine bessere Möglichkeit, Intervalle in Sekunden zu verwandeln, oder auf eine andere Art und Weise?
EDIT: Was wirklich verlangsamte war die Tatsache, dass ich einige Endzeit vor der Startzeit hatte. Aus irgendeinem Grund wurde diese Berechnung unglaublich langsam. Mein zugrunde liegendes Problem wurde gelöst, indem man sie aus dem Abfragesatz eliminierte. I definierte auch nur eine Funktion diese Umwandlung leichter zu tun:
FUNCTION fn_interval_to_sec (i IN INTERVAL DAY TO SECOND)
RETURN NUMBER
IS
numSecs NUMBER;
BEGIN
numSecs := ((extract(day from i) * 24
+ extract(hour from i))*60
+ extract(minute from i))*60
+ extract(second from i);
RETURN numSecs;
END;
Beachten Sie, dass [custom PL/SQL-Funktionen signifikante Performace Overhead] (https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:60122715103602), die möglicherweise nicht geeignet für schwere Abfragen. – Vadzim