sql >> データベース >  >> RDS >> Oracle

2つの日付の間のOraclesqlSubtract

    これは宿題だと思うので、いくつかのヒント...

    まず、日付を 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になります。 。



    1. 消費された送信トランザクションに基づいて最初のトランザクションIDを取得するOracleクエリ

    2. パスワードハッシュとソルティング-これは良い方法ですか?

    3. OracleのEXTRACT関数は、XMLELEMENTのNOENTITYESCAPINGを壊していますか?

    4. PHPを使用してドロップダウンからデータベースにデータを挿入する