sql >> Base de Datos >  >> RDS >> Oracle

SQL:¿Es posible SUM () campos de tipo INTERVALO?

Me temo que no tendrá suerte con una solución que funcione tanto en Oracle como en MSSQL. La aritmética de fechas es algo que es muy diferente en los distintos sabores de DBMS.

De todos modos, en Oracle podemos usar fechas en aritmética sencilla. Y tenemos una función NUMTODSINTERVAL que convierte un número en un INTERVALO DE DÍA A SEGUNDO. Así que vamos a ponerlos juntos.

Datos de prueba simples, dos filas con pares de fechas con una diferencia aproximada de doce horas:

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>

Consulta SQL simple para encontrar la suma del tiempo transcurrido:

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

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

SQL>

Un poco más de un día, que es lo que esperaríamos.

Trabajar con columnas TIMESTAMP es un poco más laborioso, pero aún podemos hacer el mismo truco.

En la siguiente muestra. T42T es lo mismo que T42, solo que las columnas tienen TIMESTAMP en lugar de DATE para su tipo de datos. La consulta extrae los diversos componentes del INTERVALO DS y los convierte en segundos, que luego se suman y se vuelven a convertir en un INTERVALO:

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>

¡Al menos este resultado es en segundos redondos!