2012-04-24 30 views
5

oracleに複数の日付の平均をとる方法はありますか?平均は何もしません。oracle sqlの平均日付

ありがとうございました。

+2

「平均」日付とは何ですか?私はあなたがしようとしていることについてより具体的にする必要があると思います。 –

答えて

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

+0

ありがとう。ヘルプに感謝します。 – user1261700

1

Oracleは、当然、いくつかの日付計算を処理 - 例えばTRUNC(SYSDATE)+ 1は明日の日付を返します。

だから、別のアプローチが一定にあなたの日付を比較することです:

1)は定数(例えばSYSDATE)

2)平均日で距離を比較して、ラウンド、その計算

3)平均値をSYSDATE &に換算して過去のものと比較する。

ここでこれを実行するいくつかのコード(あなたのデータを持っているどんなフィールドでDTを置き換える)、これは上記のダン・A.のアプローチのちょうど半分の下の時間で走ったいくつかのサンプルデータに

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

は、です同じ出力が得られました。 DATETIMEデータを扱う際には有名な最後の言葉であることを理解しています。

+0

ええ、それは私のソリューションよりも効率的に見えます。あなたは、計算と平均のための小さな「距離」を持っています。 –

5

「median」は一般的ではない明白な理由はありません。機能を正確にオラクルでは、まさに他の答えは何をしますか?これは、引数として数値データ型や数に暗黙的に変換することができ、数値以外のデータ型を取ることができhttps://docs.oracle.com/cd/B19306_01/server.102/b14200/functions086.htm

- ここ

は、Oracleのドキュメントへのリンクです。

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 
0

SYSDATE + AVG(dt - SYSDATE)

の日付に日付を変換する必要はありません。結果に時間が含まれないようにするには、式全体を切り捨てます。平均の計算に時間を使用したくない場合は、日付列(dt)を切り捨てます。 MEDIANはAVGと同じではありません。