Jeg er bange for, at du vil være uheldig med en løsning, der fungerer i både Oracle og MSSQL. Datoregning er noget, der er meget forskelligt på de forskellige varianter af DBMS.
I hvert fald kan vi i Oracle bruge datoer i ligetil aritmetik. Og vi har en funktion NUMTODSINTERVAL, som gør et tal til et DAG TIL ANDET INTERVAL. Så lad os sætte dem sammen.
Simple testdata, to rækker med par af datoer med ca. tolv timers mellemrum:
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>
Simpel SQL-forespørgsel til at finde summen af forløbet tid:
SQL> select numtodsinterval(sum(d1-d2), 'DAY')
2 from t42
3 /
NUMTODSINTERVAL(SUM(D1-D2),'DAY')
-----------------------------------------------------
+000000001 00:21:04.999999999
SQL>
Lidt over en dag, hvilket er, hvad vi ville forvente.
At arbejde med TIMESTAMP-kolonner er lidt mere besværligt, men vi kan stadig arbejde med det samme trick.
I følgende eksempel. T42T er det samme som T42, kun kolonnerne har TIMESTAMP i stedet for DATE for deres datatype. Forespørgslen udtrækker de forskellige komponenter i DS INTERVAL og konverterer dem til sekunder, som derefter summeres og konverteres tilbage til et 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>
Dette resultat er i det mindste på runde sekunder!