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>
少なくともこの結果は数秒で完了します!