Oracle
 sql >> Database >  >> RDS >> Oracle

SQL:è possibile sommare i campi di tipo INTERVAL?

Temo che sarai sfortunato con una soluzione che funziona sia in Oracle che in MSSQL. L'aritmetica della data è qualcosa di molto diverso nelle varie versioni di DBMS.

Ad ogni modo, in Oracle possiamo usare le date nell'aritmetica semplice. E abbiamo una funzione NUMTODSINTERVAL che trasforma un numero in un GIORNO AL SECONDO INTERVAL. Quindi mettiamoli insieme.

Dati di test semplici, due righe con coppie di date distanti tra loro circa dodici ore:

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>

Semplice query SQL per trovare la somma del tempo trascorso:

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

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

SQL>

Poco più di un giorno, che è quello che ci aspetteremmo.

Lavorare con le colonne TIMESTAMP è un po' più laborioso, ma possiamo comunque lavorare con lo stesso trucco.

Nel seguente esempio. T42T è uguale a T42 solo le colonne hanno TIMESTAMP anziché DATE per il loro tipo di dati. La query estrae i vari componenti del DS INTERVAL e li converte in secondi, che vengono poi sommati e riconvertiti in un 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>

Almeno questo risultato è in secondi rotondi!