En Oracle 10g tengo una tabla que contiene las marcas de tiempo que muestran cuánto tiempo tomaron ciertas operaciones. Tiene dos campos de marca de tiempo: hora de inicio y hora de finalización. Quiero encontrar promedios de las duraciones dadas por estas marcas de tiempo. Trato:¿Cómo se promedian los intervalos de tiempo?
select avg(endtime-starttime) from timings;
Pero sale:
SQL Error: ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND
esto funciona:
select
avg(extract(second from endtime - starttime) +
extract (minute from endtime - starttime) * 60 +
extract (hour from endtime - starttime) * 3600) from timings;
Pero es muy lento.
Cualquier forma mejor para convertir intervalos en número de segundos, o de alguna otra manera de hacer esto?
EDITAR: Lo que realmente estaba frenando esto era el hecho de que tenía algunos tiempos de finalización antes de la hora de inicio. Por alguna razón que hizo que este cálculo sea increíblemente lento. Mi problema subyacente se resolvió eliminándolos del conjunto de consultas. También se acaba de definir una función para hacer esto más fácil la conversión:
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;
Tenga en cuenta que [las funciones pl/sql personalizadas tienen una sobrecarga de rendimiento significativa] (https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:60122715103602) que pueden no ser adecuado para consultas pesadas. – Vadzim