Oracle
 sql >> Base de données >  >> RDS >> Oracle

SQL :Est-il possible de SUM() champs de type INTERVAL ?

J'ai bien peur que vous n'ayez pas de chance avec une solution qui fonctionne à la fois dans Oracle et MSSQL. L'arithmétique des dates est quelque chose de très différent selon les différentes versions de SGBD.

Quoi qu'il en soit, dans Oracle, nous pouvons utiliser des dates en arithmétique simple. Et nous avons une fonction NUMTODSINTERVAL qui transforme un nombre en un DAY TO SECOND INTERVAL. Alors rassemblons-les.

Données de test simples, deux lignes avec des paires de dates à environ douze heures d'intervalle :

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>

Requête SQL simple pour trouver la somme du temps écoulé :

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

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

SQL>

Un peu plus d'une journée, ce à quoi nous nous attendions.

Travailler avec des colonnes TIMESTAMP est un peu plus laborieux, mais nous pouvons toujours utiliser la même astuce.

Dans l'exemple suivant. T42T est identique à T42, seules les colonnes ont TIMESTAMP plutôt que DATE pour leur type de données. La requête extrait les différents composants du DS INTERVAL et les convertit en secondes, qui sont ensuite additionnées et reconverties en 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>

Au moins, ce résultat est en secondes rondes !