Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL:Ist es möglich, SUM()-Felder vom Typ INTERVAL zu verwenden?

Ich fürchte, Sie werden mit einer Lösung, die sowohl in Oracle als auch in MSSQL funktioniert, Pech haben. Die Datumsarithmetik ist etwas, das bei den verschiedenen Varianten von DBMS sehr unterschiedlich ist.

Wie auch immer, in Oracle können wir Daten in einfacher Arithmetik verwenden. Und wir haben eine Funktion NUMTODSINTERVAL, die eine Zahl in ein TAG-ZU-SEKUNDEN-INTERVALL umwandelt. Setzen wir sie also zusammen.

Einfache Testdaten, zwei Zeilen mit Datumspaaren im Abstand von ungefähr zwölf Stunden:

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>

Einfache SQL-Abfrage, um die Summe der verstrichenen Zeit zu ermitteln:

SQL> select numtodsinterval(sum(d1-d2), 'DAY')
  2  from t42
  3  /

NUMTODSINTERVAL(SUM(D1-D2),'DAY')
-----------------------------------------------------
+000000001 00:21:04.999999999

SQL>

Etwas mehr als einen Tag, was wir erwarten würden.

Die Arbeit mit TIMESTAMP-Spalten ist etwas mühsamer, aber wir können immer noch denselben Trick anwenden.

Im folgenden Beispiel. T42T ist dasselbe wie T42, nur dass die Spalten TIMESTAMP anstelle von DATE für ihren Datentyp haben. Die Abfrage extrahiert die verschiedenen Komponenten des DS-INTERVALLS und wandelt sie in Sekunden um, die dann summiert und wieder in ein INTERVAL umgewandelt werden:

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>

Zumindest ist dieses Ergebnis in runden Sekunden!