Есть ли способ усреднить несколько дат в оракуле? avg ничего хорошего не делает.Усредняющие даты в oracle sql
Спасибо.
Есть ли способ усреднить несколько дат в оракуле? avg ничего хорошего не делает.Усредняющие даты в oracle sql
Спасибо.
Определение «средняя дата» является субъективным, но вы можете преобразовать свои даты в юлианское число, затем усреднить их, округлить, затем преобразовать обратно в дату.
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
спасибо большое. оцените помощь. – user1261700
Oracle обрабатывает некоторые даты арифметику естественно - например, TRUNC (SYSDATE) + 1 вернет завтрашнюю дату.
Так что другой подход сравнить дату к константе:
1) сравнить расстояние в дни постоянной (например, SYSDATE)
2) среднее, а затем круглый, что расчет
3) сравнить среднее значение с SYSDATE & конвертировать назад.
Вот код, который делает это (замените DT с любой области имеет свои данные)
TO_DATE(
TRUNC(SYSDATE) - ROUND(AVG(TRUNC(SYSDATE) - TRUNC(dt)))
)
По некоторым данным выборки этого бежал в чуть менее половины времени подхода Дэна А. в выше, и произвел тот же результат. Я тестировал его только с данными с датами в прошлом, но я не вижу никакой очевидной причины, чтобы он не обобщал (известные слова при использовании данных DATETIME, я понимаю ...)
Да, это выглядит более эффективно, чем мое решение. У вас будет меньше «расстояний» для вычисления и среднего. –
«Медиана», функция в оракуле аккуратным образом делает именно то, что делают другие ответы.
Вот ссылка на документацию 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
SYSDATE + AVG(dt - SYSDATE)
Нет необходимости преобразовать дату в дату. Усечение всего выражения, если вы не хотите, чтобы время было включено в результат. Усечение столбца даты (dt), если вы не хотите, чтобы время использовалось при вычислении среднего. MEDIAN - это не то же самое, что AVG.
Что такое «средняя» дата? Я думаю, вам нужно быть более конкретным о том, что вы пытаетесь сделать. –