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

SQLクエリで期間の合計を計算する

    列のデータ型は、次のようにTIMESTAMPです。

    SQL> create table mytable (start_time,end_time)
      2  as
      3  select to_timestamp('2009-05-01 12:34:56','yyyy-mm-dd hh24:mi:ss')
      4       , to_timestamp('2009-05-01 23:45:01','yyyy-mm-dd hh24:mi:ss')
      5    from dual
      6   union all
      7  select to_timestamp('2009-05-01 23:45:01','yyyy-mm-dd hh24:mi:ss')
      8       , to_timestamp('2009-05-02 01:23:45','yyyy-mm-dd hh24:mi:ss')
      9    from dual
     10   union all
     11  select to_timestamp('2009-05-01 07:00:00','yyyy-mm-dd hh24:mi:ss')
     12       , to_timestamp('2009-05-01 08:00:00','yyyy-mm-dd hh24:mi:ss')
     13    from dual
     14  /
    
    Tabel is aangemaakt.
    

    あるタイムスタンプを別のタイムスタンプから引くと、INTERVALデータ型になります:

    SQL> select start_time
      2       , end_time
      3       , end_time - start_time time_difference
      4    from mytable
      5  /
    
    START_TIME                     END_TIME                       TIME_DIFFERENCE
    ------------------------------ ------------------------------ ------------------------------
    01-05-09 12:34:56,000000000    01-05-09 23:45:01,000000000    +000000000 11:10:05.000000000
    01-05-09 23:45:01,000000000    02-05-09 01:23:45,000000000    +000000000 01:38:44.000000000
    01-05-09 07:00:00,000000000    01-05-09 08:00:00,000000000    +000000000 01:00:00.000000000
    
    3 rijen zijn geselecteerd.
    

    また、INTERVALデータ型を合計することはできません。これは厄介な制限です:

    SQL> select sum(end_time - start_time)
      2    from mytable
      3  /
    select sum(end_time - start_time)
                        *
    FOUT in regel 1:
    .ORA-00932: inconsistente gegevenstypen: NUMBER verwacht, INTERVAL DAY TO SECOND gekregen
    

    この制限を回避するには、次のように秒数で変換して計算します。

    SQL> select start_time
      2       , end_time
      3       , trunc(end_time) - trunc(start_time) days_difference
      4       , to_number(to_char(end_time,'sssss')) - to_number(to_char(start_time,'sssss')) seconds_difference
      5    from mytable
      6  /
    
    START_TIME                     END_TIME                       DAYS_DIFFERENCE SECONDS_DIFFERENCE
    ------------------------------ ------------------------------ --------------- ------------------
    01-05-09 12:34:56,000000000    01-05-09 23:45:01,000000000                  0              40205
    01-05-09 23:45:01,000000000    02-05-09 01:23:45,000000000                  1             -80476
    01-05-09 07:00:00,000000000    01-05-09 08:00:00,000000000                  0               3600
    
    3 rijen zijn geselecteerd.
    

    そして、それらは合計できる通常のNUMBERです

    SQL> select sum
      2         (  86400 * (trunc(end_time) - trunc(start_time))
      3          + to_number(to_char(end_time,'sssss')) - to_number(to_char(start_time,'sssss'))
      4         ) total_time_difference
      5    from mytable
      6  /
    
    TOTAL_TIME_DIFFERENCE
    ---------------------
                    49729
    
    1 rij is geselecteerd.
    

    また、必要に応じて、この数値を間隔に戻すことができます:

    SQL> select numtodsinterval
      2         ( sum
      3           (  86400 * (trunc(end_time) - trunc(start_time))
      4            + to_number(to_char(end_time,'sssss')) - to_number(to_char(start_time,'sssss'))
      5           )
      6         , 'second'
      7         ) time_difference
      8    from mytable
      9  /
    
    TIME_DIFFERENCE
    ------------------------------
    +000000000 13:48:49.000000000
    
    1 rij is geselecteerd.
    

    よろしく、ロブ。



    1. コマンドラインで指定されていない場合にのみ、psql-scriptで変数を設定します

    2. TSQLを使用してデータベース内のすべてのテーブルのリストを取得するにはどうすればよいですか?

    3. SQL Server(T-SQL)のパーティション関数のパラメータータイプを確認します

    4. このSQLでは何を指していませんか?