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のドキュメントへのリンクは次のとおりです-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
于 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 に答える