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

SQL:INTERVALタイプのフィールドをSUM()することは可能ですか?

    OracleとMSSQLの両方で機能するソリューションでは運が悪いと思います。日付演算は、DBMSのさまざまなフレーバーで大きく異なるものです。

    とにかく、Oracleでは簡単な算術で日付を使用できます。また、数値をDAY TOSECONDINTERVALに変換する関数NUMTODSINTERVALがあります。それでは、それらをまとめましょう。

    単純なテストデータ、およそ12時間離れた日付のペアを持つ2つの行:

    SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
      2  /
    
    Session altered.
    
    SQL> select * from t42
      2  /
    
    D1                   D2
    -------------------- --------------------
    27-jul-2010 12:10:26 27-jul-2010 00:00:00
    28-jul-2010 12:10:39 28-jul-2010 00:00:00
    
    SQL>
    

    経過時間の合計を見つけるための単純なSQLクエリ:

    SQL> select numtodsinterval(sum(d1-d2), 'DAY')
      2  from t42
      3  /
    
    NUMTODSINTERVAL(SUM(D1-D2),'DAY')
    -----------------------------------------------------
    +000000001 00:21:04.999999999
    
    SQL>
    

    1日強、これは私たちが期待することです。

    TIMESTAMP列の操作は少し面倒ですが、それでも同じトリックを実行できます。

    次のサンプルでは。 T42TはT42と同じですが、列のデータ型にDATEではなくTIMESTAMPがあります。クエリはDSINTERVALのさまざまなコンポーネントを抽出し、それらを秒に変換します。秒は合計され、INTERVALに変換されます:

    SQL> select numtodsinterval(
      2              sum(
      3                  extract (day from (t1-t2)) * 86400
      4                   + extract (hour from (t1-t2)) * 3600
      5                   + extract (minute from (t1-t2)) * 600
      6                   + extract (second from (t1-t2))
      7            ), 'SECOND')
      8  from t42t
      9  /
    
    NUMTODSINTERVAL(SUM(EXTRACT(DAYFROM(T1-T2))*86400+EXTRACT(HOURFROM(T1-T2))*
    ---------------------------------------------------------------------------
    +000000001 03:21:05.000000000
    
    SQL>
    

    少なくともこの結果は数秒で完了します!



    1. データベースからデータを取得してlaravelのページを表示するにはどうすればよいですか?

    2. MySQLでトランザクションの一時停止はどのように機能しますか?

    3. mySQL-3つのテーブルのデータと列を使用して新しいテーブルを作成する

    4. LONGRAWの長さを取得する