Jag är rädd att du kommer att ha tur med en lösning som fungerar i både Oracle och MSSQL. Datumaritmetik är något som skiljer sig väldigt mycket från de olika varianterna av DBMS.
Hur som helst, i Oracle kan vi använda datum i enkel aritmetik. Och vi har en funktion NUMTODSINTERVAL som förvandlar ett tal till ett DAG TILL ANDRA INTERVAL. Så låt oss sätta ihop dem.
Enkla testdata, två rader med datumpar med ungefär tolv timmars mellanrum:
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>
Enkel SQL-fråga för att hitta summan av förfluten tid:
SQL> select numtodsinterval(sum(d1-d2), 'DAY')
2 from t42
3 /
NUMTODSINTERVAL(SUM(D1-D2),'DAY')
-----------------------------------------------------
+000000001 00:21:04.999999999
SQL>
Drygt en dag, vilket är vad vi kan förvänta oss.
Att arbeta med TIMESTAMP-kolumner är lite mer mödosamt, men vi kan fortfarande arbeta med samma knep.
I följande exempel. T42T är samma som T42 bara kolumnerna har TIMESTAMP snarare än DATE för sin datatyp. Frågan extraherar de olika komponenterna i DS INTERVAL och omvandlar dem till sekunder, som sedan summeras och omvandlas tillbaka till ett 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>
Åtminstone detta resultat är i runda sekunder!