有没有办法在oracle中平均多个日期?平均没有任何好处。
感谢。
答案 0 :(得分: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
答案 1 :(得分:5)
oracle中的'中间'函数以一种简洁的方式完成了其他答案。
以下是Oracle文档的链接 - https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions086.htm
可以将arg作为数值数据类型或非数字数据类型,可以隐式转换为数字。
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
答案 2 :(得分:1)
Oracle自然处理一些日期算术 - 例如TRUNC(SYSDATE)+ 1将返回明天的日期。
另一种方法是将你的日期与常数进行比较:
1)将天数与常数(例如SYSDATE)进行比较
2)平均,然后再计算,
3)比较平均值回到SYSDATE&转换回来。
以下是执行此操作的一些代码(将 dt 替换为包含数据的任何字段)
TO_DATE(
TRUNC(SYSDATE) - ROUND(AVG(TRUNC(SYSDATE) - TRUNC(dt)))
)
在一些样本数据上,这个数据的运行时间不到Dan A.上述方法的一半,并产生相同的输出。仅针对过去日期的数据进行了测试,但我没有看到任何明显的原因,即它不会概括(在处理DATETIME数据时,我知道......)。
答案 3 :(得分:0)
SYSDATE + AVG( dt - SYSDATE )
无需将日期转换为日期。如果您不希望结果中包含时间,则截断整个表达式。如果您不希望在计算平均值时使用时间,则截断日期列(dt)。 MEDIAN与AVG不同。