¿Cómo promediar intervalos de tiempo?
En Oracle 10g tengo una tabla que contiene 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. Lo intento:
select avg(endtime-starttime) from timings;
Pero obtén:
Error de SQL: ORA-00932: tipos de datos inconsistentes: el NÚMERO esperado obtuvo DÍA DE INTERVALO AL SEGUNDO
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 realmente lento.
¿Alguna mejor manera de convertir los intervalos en números de segundos, o de alguna otra manera hacer esto?
EDITAR: Lo que realmente desaceleró esto fue el hecho de que tenía algunos tiempos finales antes del tiempo de inicio. Por alguna razón, este cálculo fue increíblemente lento. Mi problema subyacente se resolvió eliminándolos del conjunto de consultas. También acabo de definir una función para hacer esta conversión más fácil:
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;