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

OracleSQLで2つの日付間の経過時間を検索します

    2つのDATEを引くと enddate - startdateのような値 10進数の精度で日数の差が得られるため、たとえば1.5は1日半または36時間を意味します。これをHH:MI:SSに変換できます 多くの数学を使用しますが、より簡単な方法は、10進値をINTERVAL DAY TO SECONDに変換することです。 NUMTODSINTERVALを使用した値 機能:

      NUMTODSINTERVAL(enddate - startdate, 'DAY')
    

    TO_CHAR 関数はこれをHH:MI:SSとしてフォーマットできます。 、しかしそれはそのように機能していないようです。 EXTRACTを使用できます 代わりに、TO_CHAR 先行ゼロを確実に取得するには:

     TO_CHAR(EXTRACT(HOUR FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
       || ':' ||
     TO_CHAR(EXTRACT(MINUTE FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
       || ':' ||
     TO_CHAR(EXTRACT(SECOND FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
    

    00 フォーマットコードの一部は2桁を指定し、必要に応じて先行ゼロを付けます。 FM パーツは、フォーマットされた結果の先頭のスペースを取り除きます。これは、必要に応じて負の符号用に予約されています。

    また、クエリは集計値を取得し、それらを同じSELECTで使用することにも注意してください。 リスト。オラクルはこれを許可しません。代わりに次のようなものを試してください:

    WITH StartEndByID AS (
      SELECT
        msglog.id,
        NUMTODSINTERVAL(max(msglog.timestamp) - min(msglog.timestamp), 'DAY') elapsed
      FROM messagelog msglog
      GROUP BY id
    )
    SELECT
      id,
      TO_CHAR(EXTRACT(HOUR FROM elapsed), 'FM00') || ':' ||
        TO_CHAR(EXTRACT(MINUTE FROM elapsed), 'FM00') || ':' ||
        TO_CHAR(EXTRACT(SECOND FROM elapsed), 'FM00') AS ElapsedHHMISS
    FROM StartEndByID
    


    1. SQLServerのパフォーマンスを損なうActivityMonitorを回避する方法

    2. データベースで継承を効果的にモデル化するにはどうすればよいですか?

    3. PostgreSQLでage()がどのように機能するか

    4. SQLServerでONDELETECASCADEを使用して外部キー制約を作成する方法-SQLServer/TSQLチュートリアルパート80