2012-04-24 138 views
5

¿Hay alguna forma de promediar varias fechas en Oracle? avg no hace ningún bien.Promedio de fechas en Oracle sql

Gracias.

+2

¿Qué es una fecha "promedio"? Creo que deberás ser más específico sobre lo que intentas hacer. –

Respuesta

14

La definición de "fecha promedio" es subjetiva, pero puede convertir sus fechas en números Julianos, promediarlas, redondearlas y luego convertirlas a una fecha.

create table dates (dt DATE); 

insert into dates 
values ('24-APR-2012'); 
insert into dates 
values ('01-JAN-2012'); 
insert into dates 
values ('01-JAN-2013'); 
insert into dates 
values ('25-DEC-1900'); 


select to_date(round(avg(to_number(to_char(dt, 'J')))),'J') 
from dates; 

Aquí está el violín SQL: http://sqlfiddle.com/#!4/98ce9/1

+0

muchas gracias. aprecia la ayuda – user1261700

1

Oracle maneja alguna fecha aritmética natural - por ejemplo TRUNCAR (SYSDATE) + 1 volverá fecha de mañana.

Así Otro método consiste en comparar su fecha a una constante:

1) comparar la distancia en día a una constante (por ejemplo SYSDATE)

2) promedio y luego se redondea, que el cálculo

3) compare el promedio de regreso a SYSDATE & convertir a la fecha.

Aquí hay un código que hace esto (sustituir dt con cualquier campo tiene sus datos)

TO_DATE(
    TRUNC(SYSDATE) - ROUND(AVG(TRUNC(SYSDATE) - TRUNC(dt))) 
) 

En algunos datos de ejemplo de este corrió en poco menos de la mitad del tiempo del enfoque de Dan A. anteriormente, y produjo el mismo resultado. Solo lo probé con datos con fechas anteriores, pero no veo ninguna razón obvia de que no se generalice (me doy cuenta de que las últimas palabras son famosas cuando se trata de datos de DATETIME ...)

+0

Sí, parece más eficiente que mi solución. Tendrás "distancias" más pequeñas para calcular y promediar. –

5

La 'mediana' Funcionar en el oráculo de una manera ordenada hace exactamente lo que hacen otras respuestas.

Aquí hay un enlace a la documentación de Oracle - https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions086.htm

Se puede tomar como un arg un tipo de datos numérico o un tipo de datos no numérico que se puede convertir implícitamente a un número.

SQL> desc x1 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
A           NOT NULL NUMBER 
D             DATE 

SQL> select * from x1; 

    A D 
---------- --------- 
    1 11-DEC-14 
    2 13-DEC-14 
    3 22-DEC-14 
    4 02-DEC-14 
SQL> select median(d) from x1; 

MEDIAN(D) 
--------- 
12-DEC-14 
0

SYSDATE + AVG(dt - SYSDATE)

No hay necesidad de convertir una fecha a una fecha. Trunca toda la expresión si no quieres incluir el tiempo en el resultado. Trunca la columna de fecha (dt) si no quieres que se usen las horas en el cálculo del promedio. MEDIAN no es lo mismo que AVG.