Más INTERVALs: La vista es la que trabaja

Como en los antiguos pasatiempos, ¿Dónde está la diferencia?

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT CAST((DATE-(DATE - 4)) AS INTERVAL MONTH(2));

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

(Current Date-(Current Date-4))
-------------------------------
                              4

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT (DATE-(DATE - 4)) MONTH(2);

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

(Current Date - (Current Date-4)) MONTH
---------------------------------------
                                      0

¿Cómo es que se producen resultados diferentes? Y no, no es por el tipo de dato del resultado:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT TYPE(CAST((DATE-(DATE - 4)) AS INTERVAL MONTH(2)));

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

Type((Current Date-(Current Date-4)))
---------------------------------------
INTERVAL MONTH(2)

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT TYPE((DATE-(DATE - 4)) MONTH(2));

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

Type((Current Date - (Current Date-4)) MONTH)
---------------------------------------------
INTERVAL MONTH(2)

La explicación (como en los trucos de magia) es que estamos haciendo trampa. Comparando peras con manzanas, cosa que tanto le molesta a Ana Botella.

Cuando usamos el CAST estamos haciendo una transformación de tipos ordinaria: el 4 (INTEGER) es convertido en 4 meses (INTERVAL MONTH).

Pero al hacer ‘SELECT (DATE-(DATE – 4)) MONTH(2);’ estamos distrayendo al público, ya que aquí no estamos haciendo un simple CAST: lo que estamos utilizando es aritmética de fechas diciéndole a Teradata que nos dé la diferencia de las dos fechas EN MESES (en vez de en días, que es la opción por defecto y la que se utiliza en la opción con ‘CAST’) y la convierta después a INTERVAL MONTH. Este cálculo (al igual que lo que vimos aquí) no tiene en cuenta la parte ‘días’ de la fecha, sólo la diferencia de meses: de ahí el cero resultante y la solución al enigma.

Saludos.

Carlos.

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: