Боюсь, вам не повезет с решением, которое работает как в Oracle, так и в MSSQL. Арифметика дат - это то, что сильно различается в разных вариантах СУБД.
В любом случае, в Oracle мы можем использовать даты в простой арифметике. И у нас есть функция NUMTODSINTERVAL, которая превращает число в ДЕНЬ ВТОРОГО ИНТЕРВАЛА. Итак, давайте соединим их.
Простые тестовые данные, две строки с парами дат, грубо с интервалом в двенадцать часов:
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>
Чуть больше суток, что мы и ожидали.
«Редактировать: изменено ДАТА на ИНТЕРВАЛ»
Работа со столбцами TIMESTAMP немного более трудоемка, но мы все еще можем выполнить тот же трюк.
В следующем примере. T42T совпадает с T42, только столбцы имеют TIMESTAMP, а не DATE для своего типа данных. Запрос извлекает различные компоненты DS INTERVAL и преобразует их в секунды, которые затем суммируются и преобразуются обратно в 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>
По крайней мере, этот результат в секундах раунда!