8

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

谢谢。

4

4 回答 4

17

“平均日期”的定义是主观的,但您可以将日期转换为儒略数,然后将它们平均,四舍五入,然后转换回日期。

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

于 2012-04-24T23:46:59.970 回答
8

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
于 2014-12-12T10:00:51.113 回答
2

Oracle 自然地处理一些日期算术 - 例如 TRUNC(SYSDATE) + 1 将返回明天的日期。

所以另一种方法是将您的日期与常数进行比较:

1) 以天为单位将距离与常数进行比较(例如 SYSDATE)

2)平均,然后四舍五入,计算

3) 将平均值与 SYSDATE 进行比较并转换回日期。

这是一些执行此操作的代码(将dt替换为包含您的数据的任何字段)

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

在一些样本数据上,运行的时间不到 Dan A. 上述方法的一半,并且产生了相同的输出。仅针对具有过去日期的数据对其进行了测试,但我看不出有任何明显的原因表明它不会泛化(处理 DATETIME 数据时著名的遗言,我意识到......)

于 2012-07-29T16:27:15.320 回答
1

SYSDATE + AVG( dt - SYSDATE )

无需将日期转换为日期。如果您不希望结果中包含时间,请截断整个表达式。如果您不希望在计算平均值时使用时间,请截断日期列 (dt)。MEDIAN 与 AVG 不同。

于 2017-03-30T17:27:45.303 回答