これは宿題だと思うので、いくつかのヒント...
まず、日付を varchar
として保存しないでください 、それはあなたとオプティマイザーにあらゆる種類の問題を引き起こします。
次に、Oracleの date
データ型は秒の精度でしか格納できず、文字列は1秒未満であるため、タイムスタンプ
日付
ではなく
。 <を使用して、文字列をタイムスタンプに変換できます。 code> to_timestamp()
関数、適切なフォーマットマスク
を渡します 。ああ、私は寛大だと感じています:
select to_timestamp(start_date, 'DD-Mon-RR HH.MI.SS.FF9 AM') from your_table;
第3に、2つのタイムスタンプを引くと、 間隔
読み取り可能な形式で必要な情報を抽出する必要があるデータ型。このサイトまたは他の場所でタイムスタンプの減算を検索しますが、
平均は少しトリッキーなので、間隔をその数値に変換することをお勧めします。 これ などの以前の質問をもう一度検索します 。間隔のサイズ、実際に気にする精度、出力のフォーマット方法などは、採用するアプローチにある程度影響します。
おおよその結果が必要な場合は、@ Joachim Isakssonの回答から、次のようになります。たとえば、1秒未満の期間はゼロとして表示されます。タイムスタンプを日付にキャストしても同じ効果が見られますが、これも秒の小数部を失います:
select 24*60*60*avg(
cast(to_timestamp(step_ending_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as date)
- cast(to_timestamp(step_starting_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as date)
) as avg_duration
from process_audit;
以前にリンクした質問のように、タイムスタンプのさまざまなコンポーネントを抽出することで、より正確な答えを見つけることができます。たとえば、期間が常に1時間未満であることがわかっている場合は、すべてが必要になるとは限りませんが、複数が必要な場合(つまり、期間が1分を超える可能性がある場合)、中間共通テーブル式を使用すると、作業が簡単になります。ビット:
with cte as (
select to_timestamp(step_ending_time, 'DD-Mon-RR HH.MI.SS.FF9 AM')
- to_timestamp(step_starting_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as duration
from process_audit
)
select avg(extract(second from duration)
+ extract(minute from duration) * 60
+ extract(hour from duration) * 60 * 60
+ extract(day from duration) * 60 * 60 * 24) as avg_duration
from cte;
2つのサンプル行(1つは正確に1秒のギャップ、もう1つは正確に1.5秒のギャップ)を使用すると、結果は 1.25
になります。 。