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

Oracleは24時間以上表示します

    時差を構成する日、時、分、秒の要素に分解し、日数* 24と時間数を組み合わせて、元に戻す必要があります。

    日付を引くと、日数として差が得られるため、小数部分を他の要素に変換する必要があります。これは、truncとmodの組み合わせで実行できます。 CTEを使用して、これを少し簡単に追跡できるようにし、各値を独自に表示したり、単一の文字列に結合したりします。

    with y as (
      select id, end_time - start_time as runtime
      from mytable
    )
    select id,
      runtime,
      trunc(runtime) as days,
      24 * trunc(runtime) as day_hours,
      trunc(24 * mod(runtime, 1)) as hours,
      trunc(60 * mod(24 * (runtime), 1)) as minutes,
      trunc(60 * mod(24 * 60 * (runtime), 1)) as seconds,
      lpad(24 * trunc(runtime)
        + trunc(24 * mod(runtime, 1)), 2, '0')
        ||':'|| lpad(trunc(60 * mod(24 * (runtime), 1)), 2, '0')
        ||':'|| lpad(trunc(60 * mod(24 * 60 * (runtime), 1)), 2, '0')
        as runtime
    from y;
    
            ID    RUNTIME       DAYS  DAY_HOURS      HOURS    MINUTES    SECONDS RUNTIME 
    ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------
             1 .184918981          0          0          4         26         16 04:26:16 
             2 1.14465278          1         24          3         28         18 27:28:18 
    

    計算のために日付をタイムスタンプに変換して、間隔タイプを指定してから、extractを使用することもできます。 代わりに要素を取得する関数。ただし、プリンシパルは同じです:

    with y as (
      select id,
        cast(end_time as timestamp) - cast (start_time as timestamp) as runtime
      from mytable
    )
    select id,
      runtime,
      extract (day from runtime) as days,
      24 * extract (day from runtime) as day_hours,
      extract (hour from runtime) as hours,
      extract (minute from runtime) as minutes,
      extract (second from runtime) as seconds,
      lpad(24 * extract (day from runtime) + extract (hour from runtime), 2, '0')
        ||':'|| lpad(extract (minute from runtime), 2, '0')
        ||':'|| lpad(extract (second from runtime), 2, '0')
        as runtime
    from y;
    
            ID RUNTIME           DAYS  DAY_HOURS      HOURS    MINUTES    SECONDS RUNTIME 
    ---------- ----------- ---------- ---------- ---------- ---------- ---------- --------
             1 0 4:26:17.0          0          0          4         26         17 04:26:17 
             2 1 3:28:18.0          1         24          3         28         18 27:28:18 
    

    または、わずかなバリエーションで、日付との差を取得し、それを間隔に変換します:

    with y as (
      select id,
        numtodsinterval(end_time - start_time, 'DAY') as runtime
      from mytable
    )
    ...
    

    SQLフィドルのデモ。




    1. Oracleデータベースのテーブル変更列を変更します

    2. MySQLドロップテーブル

    3. BinaryTarballからMySQL8をセットアップする

    4. PostgresqlでプログラムによってDDLを生成する