Я боюсь, что вы будете не повезло с решение, которое работает как в 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>
Только за один день, который это то, чего мы ожидаем.
«Edit: изменен ДАТА интервальных»
Работа с TIMESTAMP колоннами немного больше трудоемкий, но мы все еще можем работать тот же трюк.
В следующем примере. T42T - это то же самое, что и T42, только для столбцов вместо DATE используется TIMESTAMP, а не тип DATAT.Запроса извлекает различные компоненты DS ИНТЕРВАЛА и преобразует их в секунды, которые затем суммируются и преобразуются обратно в интервальный:
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 и 2 минуты. Они имеют значения, как 1 минута после полуночи 26 июля. Во-вторых, что бы это означало для суммирования дат? Что вы на самом деле пытаетесь достичь? – MJB
Черт, я думал, что пытаюсь суммировать даты. Фактически, я сделал это вычитание двух дат, а затем попытался SUM. Итак, у меня есть ошибка «ORA-00932: непоследовательные типы данных: ожидается, что NUMBER получил INTERVAL DAY TO SECOND». Теперь, где кнопка редактирования? :) –
Некоторые СУБД поддерживают суммирование значений INTERVAL - один из них - IBM Informix Dynamic Server. Тем не менее, большинство нет. –