2012-04-24 1 views
5

Есть ли способ усреднить несколько дат в оракуле? avg ничего хорошего не делает.Усредняющие даты в oracle sql

Спасибо.

+2

Что такое «средняя» дата? Я думаю, вам нужно быть более конкретным о том, что вы пытаетесь сделать. –

ответ

14

Определение «средняя дата» является субъективным, но вы можете преобразовать свои даты в юлианское число, затем усреднить их, округлить, затем преобразовать обратно в дату.

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; 

Вот SQL Скрипки: http://sqlfiddle.com/#!4/98ce9/1

+0

спасибо большое. оцените помощь. – user1261700

1

Oracle обрабатывает некоторые даты арифметику естественно - например, TRUNC (SYSDATE) + 1 вернет завтрашнюю дату.

Так что другой подход сравнить дату к константе:

1) сравнить расстояние в дни постоянной (например, SYSDATE)

2) среднее, а затем круглый, что расчет

3) сравнить среднее значение с SYSDATE & конвертировать назад.

Вот код, который делает это (замените DT с любой области имеет свои данные)

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

По некоторым данным выборки этого бежал в чуть менее половины времени подхода Дэна А. в выше, и произвел тот же результат. Я тестировал его только с данными с датами в прошлом, но я не вижу никакой очевидной причины, чтобы он не обобщал (известные слова при использовании данных DATETIME, я понимаю ...)

+0

Да, это выглядит более эффективно, чем мое решение. У вас будет меньше «расстояний» для вычисления и среднего. –

5

«Медиана», функция в оракуле аккуратным образом делает именно то, что делают другие ответы.

Вот ссылка на документацию Oracle - https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions086.htm

Это может занять как арг числовой тип данных или нечисловой тип данных, которые могут быть преобразованы неявно число.

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)

Нет необходимости преобразовать дату в дату. Усечение всего выражения, если вы не хотите, чтобы время было включено в результат. Усечение столбца даты (dt), если вы не хотите, чтобы время использовалось при вычислении среднего. MEDIAN - это не то же самое, что AVG.