Oracleで複数の日付を平均化する方法はありますか?avgは何の役にも立ちません。
ありがとう。
「平均日付」の定義は主観的ですが、日付をジュリアン数に変換し、それらを平均して四捨五入してから、日付に戻すことができます。
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
オラクルの「中央値」関数は、他の回答とまったく同じように機能します。
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
Oracleは、いくつかの日付演算を自然に処理します。たとえば、TRUNC(SYSDATE)+1は明日の日付を返します。
したがって、別のアプローチは、日付を定数と比較することです。
1)日単位の距離を定数(例:SYSDATE)と比較します
2)その計算を平均してから丸めます
3)平均をSYSDATEと比較し、日付に変換し直します。
これを行うコードを次に示します( dtをデータのあるフィールドに置き換えます)
TO_DATE(
TRUNC(SYSDATE) - ROUND(AVG(TRUNC(SYSDATE) - TRUNC(dt)))
)
一部のサンプルデータでは、これは上記のDan A.のアプローチの半分弱の時間で実行され、同じ出力を生成しました。過去の日付のデータに対してのみテストしましたが、一般化されない明確な理由はわかりません(DATETIMEデータを処理する際の有名な最後の言葉です...)
SYSDATE + AVG( dt - SYSDATE )
日付を日付に変換する必要はありません。結果に時間を含めたくない場合は、式全体を切り捨てます。平均の計算に時間を使用したくない場合は、日付列(dt)を切り捨てます。MEDIANはAVGと同じではありません。