在oracle sql中平均日期

时间:2012-04-24 23:21:52

标签: sql oracle date average

有没有办法在oracle中平均多个日期?平均没有任何好处。

感谢。

4 个答案:

答案 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不同。