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

時間減算形式の結果

    あるタイムスタンプを別のタイムスタンプから減算すると、結果は内部間隔データ型になりますが、「間隔日から秒」として扱うことができます:

    select
    (localtimestamp - to_timestamp(us.STARTDATETIME,'hh24:mi:ss')) as HoursPassed
    from random us;
    
    HOURSPASSED        
    -------------------
    +08 15:26:54.293892
    

    '+08'(私のセッションタイムゾーン)は日数であり、UTCオフセットではありません。これは、文字列を日付またはタイムスタンプに変換し、時間部分のみを指定すると、日付部分がデフォルトで当月の初日に設定されるためです。

    デフォルトの日付値は次のように決定されます。

    • 年は、SYSDATEによって返される現在の年です。
    • 月は、SYSDATEによって返される現在の月です。
    • 日は01(月の最初の日)です。
    • 時、分、秒はすべて0です。

    これらのデフォルト値は、日付自体が指定されていない日付値を要求するクエリで使用されます...

    だから私は本当に比較しています:

    select localtimestamp, to_timestamp(us.STARTDATETIME,'hh24:mi:ss')
    from random us;
    
    LOCALTIMESTAMP             TO_TIMESTAMP(US.STARTDATET
    -------------------------- --------------------------
    2017-08-09 23:26:54.293892 2017-08-01 08:00:00.000000
    

    間隔を直接フォーマットすることはできませんが、時間の要素を抽出して個別にフォーマットし、それらを連結することはできます。

    select to_char(extract(hour from (localtimestamp
        - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
      ||':'|| to_char(extract(minute from (localtimestamp
        - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
      ||':'|| to_char(extract(second from (localtimestamp
        - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
      as hourspassed
    from random us;
    
    HOURSPASSED
    -----------
    15:26:54
    

    同じ間隔を繰り返し計算するのは少し無駄で管理が難しいように見えるので、インラインビューまたはCTEで計算できます:

    with cte (diff) as (
      select localtimestamp - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss')
      from random us
    )
    select to_char(extract(hour from diff), 'FM00')
      ||':'|| to_char(extract(minute from diff), 'FM00')
      ||':'|| to_char(extract(second from diff), 'FM00')
      as hourspassed
    from cte;
    
    HOURSPASSED
    -----------
    15:26:54
    

    タイムスタンプの代わりに日付を使用することもできます。減算すると、日数と小数日で差が数値として得られます。

    select current_date - to_date(us.STARTDATETIME, 'hh24:mi') as hourspassed
    from random us;
    
    HOURSPASSED
    -----------
     8.64368056
    

    フォーマットする最も簡単な方法は、既知の深夜時間に追加してから、to_char()を使用することです。 :

    select to_char(date '1970-01-01'
      + (current_date - to_date(us.STARTDATETIME, 'hh24:mi')),
      'HH24:MI:SS') as hourspassed
    from random us;
    
    HOURSPAS
    --------
    15:26:54
    

    current_dateを使い続けました localtimestampに最も近いものとして;実際にはsystimestampが必要な場合があります および/またはsysdate 。 (違いについてはこちらをご覧ください。)




    1. 日付範囲間の日付を生成する

    2. Django:復元(移行)後にデータベースにアクセスしようとしたときにアクセス許可が拒否されました

    3. 別のTransactSQLスクリプトを実行するためのTransactSQL

    4. MariaDB USER()の説明