Calcular diferencias entre TIMESTAMPS

Todos sabemos calcular la diferencia entre dos fechas:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT (F_FIN - F_INICIO) "DIFF"
  FROM (SELECT DATE F_FIN, DATE - 1 F_INICIO) PRE;


 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

       DIFF
-----------
          1

Pero la cosa se complica si hablamos de TIMESTAMPS:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT (F_FIN-F_INICIO) "DIFF"
  FROM (SELECT CURRENT_TIMESTAMP(0) F_FIN,
               CURRENT_TIMESTAMP(0) - INTERVAL '1' HOUR F_INICIO) PRE
;

 *** Failure 5407 Invalid operation for DateTime or Interval.
                Statement# 1, Info =0
 *** Total elapsed time was 1 second.

Para solucionar el problema se ven por ahí todo tipo de “técnicas” mediante el uso de EXTRACT() o, peor aun, mediante sucesivos CAST() a VARCHAR y demás triquiñuelas.
Pero la solución es mucho más fácil: todo se resume a que la diferencia entre TIMESTAMPS es siempre un ‘INTERVAL’ “genérico” que simplemente hay que definir mediante cualquiera de sus diferentes tipos:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT (F_FIN-F_INICIO) YEAR "YEAR",
       (F_FIN-F_INICIO) YEAR TO MONTH "YEARtoMONTH",
       (F_FIN-F_INICIO) MONTH "MONTH",
       (F_FIN-F_INICIO) DAY "DAY",
       (F_FIN-F_INICIO) DAY TO HOUR "DAYtoHOUR",
       (F_FIN-F_INICIO) DAY TO MINUTE "DAYtoMIN",
       (F_FIN-F_INICIO) DAY TO SECOND(0) "DAYtoSEC",
       (F_FIN-F_INICIO) HOUR "HOUR",
       (F_FIN-F_INICIO) HOUR(2) TO MINUTE "HOURtoMIN",
       (F_FIN-F_INICIO) HOUR(2) TO SECOND(0) "HOURtoSEC",
       (F_FIN-F_INICIO) MINUTE(2) "MIN",
       (F_FIN-F_INICIO) MINUTE(2) TO SECOND(0) "MINtoSEC",
       (F_FIN-F_INICIO) SECOND(4,0) "SEC"
  FROM (SELECT CURRENT_TIMESTAMP(0) F_FIN, 
               CURRENT_TIMESTAMP(0) - INTERVAL '1' HOUR F_INICIO) PRE
;


 *** Query completed. One row found. 13 columns returned.
 *** Total elapsed time was 1 second.

YEAR YEARtoMONTH MONTH DAY DAYtoHOUR  DAYtoMIN     DAYtoSEC HOUR HOURtoMIN HOURtoSEC MIN MINtoSEC   SEC
---- ----------- ----- --- --------- --------- ------------ ---- --------- --------- --- -------- -----
   0        0-00     0   0      0 01   0 01:00   0 01:00:00    1      1:00   1:00:00  60    60:00  3600

Simplemente hay que poner atención en las precisiones y los fraccionales de los tipos para evitar desbordamientos (Failure 7453 Interval field overflow.):

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT (F_FIN-F_INICIO) SECOND "SECOND"
  FROM (SELECT CURRENT_TIMESTAMP(0) F_FIN, 
               CURRENT_TIMESTAMP(0) - INTERVAL '1' HOUR F_INICIO) PRE
;

 *** Failure 7453 Interval field overflow.
                Statement# 1, Info =0
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT (F_FIN-F_INICIO) SECOND(4,0) "SECOND"
  FROM (SELECT CURRENT_TIMESTAMP(0) F_FIN,
               CURRENT_TIMESTAMP(0) - INTERVAL '1' HOUR F_INICIO) PRE
;


 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

SECOND
------
  3600

…and that’s all.

Saludos.

Carlos.

Anuncios

One Response to Calcular diferencias entre TIMESTAMPS

  1. […] Ya vimos que las operaciones entre TIMESTAMPs siempre resultan en INTERVALS. Lo mismo ocurre con los TIME: […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: