Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

SQL:É possível SUM() campos do tipo INTERVAL?


Receio que você não tenha sorte com uma solução que funcione tanto no Oracle quanto no MSSQL. A aritmética de datas é algo muito diferente nos vários tipos de DBMS.

De qualquer forma, no Oracle podemos usar datas em aritmética direta. E temos uma função NUMTODSINTERVAL que transforma um número em um DAY TO SECOND INTERVAL. Então vamos colocá-los juntos.

Dados de teste simples, duas linhas com pares de datas com aproximadamente doze horas de intervalo:
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 simples para encontrar a soma do tempo decorrido:
SQL> select numtodsinterval(sum(d1-d2), 'DAY')
  2  from t42
  3  /

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

SQL>

Pouco mais de um dia, que é o que seria de esperar.

Trabalhar com colunas TIMESTAMP é um pouco mais trabalhoso, mas ainda podemos fazer o mesmo truque.

Na amostra a seguir. T42T é o mesmo que T42, apenas as colunas têm TIMESTAMP em vez de DATE para seu tipo de dados. A consulta extrai os vários componentes do DS INTERVAL e os converte em segundos, que são somados e convertidos novamente em um 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>

Pelo menos esse resultado é em segundos redondos!