Вопрос по date, sql – Усреднение дат в оракуле sql
«Медиана» функция в оракуле аккуратно делает именно то, что делают другие ответы.
Вот ссылка на документацию 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.
Oracle обрабатывает некоторую арифметику дат естественным образом - например, TRUNC (SYSDATE) + 1 вернет завтрашнюю дату.
Поэтому другой подход - сравнить вашу дату с константой:
1) сравнить расстояние в днях с константой (например, SYSDATE)
2) средний, а затем круглый, что расчет
3) сравнить среднее значение с SYSDATE & amp; преобразовать обратно в дату.
Вот некоторый код, который делает это (заменитеdt с каким полем есть ваши данные)
TO_DATE(
TRUNC(SYSDATE) - ROUND(AVG(TRUNC(SYSDATE) - TRUNC(dt)))
)
В некоторых выборочных данных это происходило менее чем в два раза быстрее, чем описанный выше подход Дана А., и приводило к тому же результату. Только проверял его по данным с датами в прошлом, но я не вижу какой-либо очевидной причины, по которой он не будет обобщать (известные последние слова при работе с данными DATETIME, я понимаю ...)
Определение «средней даты» субъективно, но вы можете преобразовать свои даты в юлианские числа, затем усреднить их, округлить, а затем преобразовать обратно в дату.
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 Fiddle:http://sqlfiddle.com/#!4/98ce9/1