Descripción: Convierte una expresión de un tipo de datos a otro tipo de datos o dominio. Si la conversión no es posible envía un error.

Tipo de resultado: Elegido por el usuario

Sintaxis:

      CAST(Expresión AS <tipo_datos>)

      tipo_datos = Tipo_de_datos_SQL |
                   [TYPE OF] dominio |
                   TYPE OF COLUMN NombreTabla.NombreColumna

Sintaxis abreviada:

Hay una sintaxis alternativa que puede usarse solamente para convertir a DATE, TIME o TIMESTAMP

      Tipo_de_datos ‘date/timestring’

Ejemplos:

Usando la sintaxis completa:

   SELECT CAST('21' || '-April-' || '2013' AS DATE) FROM RDB$DATABASE

Usando la sintaxis abreviada:

UPDATE
   PRODUCTOS
SET
   FECHA_VENCIMIENTO = CURRENT_DATE + 45        -- la fecha de vencimiento será dentro de 45 días
WHERE
   FECHA_ULTIMA_COMPRA = DATE '21-JAN-2013'     -- para todos los productos que se compraron el 21 de enero de 2013

En algunos casos no es necesario siquiera usar la sintaxis abreviada porque el Firebird entenderá que debe convertir la cadena a fecha. El ejemplo anterior podría ser reescrito así:

UPDATE
   PRODUCTOS
SET
   FECHA_VENCIMIENTO = CURRENT_DATE + 45   -- la fecha de vencimiento será dentro de 45 días
WHERE
   FECHA_ULTIMA_COMPRA = '21-JAN-2013'     -- para todos los productos que se compraron el 21 de enero de 2013

en el cual eliminamos la palabra DATE.

Pero la forma abreviada no siempre es posible, el siguiente caso conducirá a un error porque el Firebird creerá que quieres restarle un entero a una cadena alfanumérica.

SELECT
   'TODAY' - 7
FROM
   RDB$DATABASE

La forma correcta de escribirlo es la siguiente, en la cual la palabra DATE le indica al Firebird que debe convertir la palabra ‘TODAY’ a la fecha de hoy:

SELECT
   DATE 'TODAY' - 7     -- DATE 'TODAY' devuelve la fecha de hoy. Este es un cast abreviado.
FROM
   RDB$DATABASE

Conversiones posibles:

La siguiente tabla muestra las conversiones que pueden realizarse con la función CAST()

-------------------------------------
|Desde              Hacia           |
-------------------------------------
|Tipos numéricos    Tipos numéricos |
|                   [VAR]CHAR       |
|                   BLOB            |
-------------------------------------
|[VAR]CHAR          [VAR]CHAR       |
|BLOB               BLOB            |
|                   Tipos numéricos |
|                   DATE            |
|                   TIME            |
|                   TIMESTAMP       |
-------------------------------------
|DATE               [VAR]CHAR       |
|TIME               BLOB            |
|                   TIMESTAMP       |
-------------------------------------

Recuerda que algunas veces la información puede perderse, por ejemplo cuando moldeas (o sea, haces el cast) de un TIMESTAMP a un DATE. En este caso se perderá la parte de la hora y te quedará solamente la parte de la fecha. Además, el hecho de que según la tabla de arriba pueda convertirse no es garantía de que tal conversión se realice con éxito. Por ejemplo: CAST(‘123456789’ AS SMALLINT) causará un error: “Arithmetic exception, numeric overflow, or string truncation.” ¿Por qué eso? porque el número más grande del tipo SMALLINT que puedes tener es 32767 y el número 123456789 es mayor que 32767.

También escribir algo como CAST(‘New Year’ AS DATE) causará un error.

Haciendo el cast a un dominio o su tipo:

Cuando se moldea (se hace el cast) a un dominio o a su tipo se deben satisfacer las restricciones (NOT NULL y/o CHECK) del dominio o el cast fallará. Un CHECK pasará si evalúa a TRUE o a NULL. Cuidado con esto último: un NULL pasará.

CREATE DOMAIN D_PRECIO_VENTA AS INTEGER CHECK (VALUE >= 1000)
SELECT CAST( 500 AS D_PRECIO_VENTA) FROM RDB$DATABASE     -- (1)
SELECT CAST(3000 AS D_PRECIO_VENTA) FROM RDB$DATABASE     -- (2)
SELECT CAST(NULL AS D_PRECIO_VENTA) FROM RDB$DATABASE     -- (3)

Solamente el primer cast (el número 1) resultará en un error, los otros dos casts pasarán. Cuando el modificador TYPE OF es usado la expresión es moldeada (cast) al tipo base del dominio, ignorando por lo tanto cualquier restricción que tenga ese dominio.

SELECT CAST(400 AS TYPE OF D_PRECIO_VENTA) FROM RDB$DATABASE
SELECT CAST(400 AS INTEGER)                FROM RDB$DATABASE

Los dos SELECT de arriba son equivalentes y ambos funcionarán bien. Recuerda que TYPE OF D_PRECIO_VENTA es lo mismo que escribir INTEGER ya que el tipo de D_PRECIO_VENTA es INTEGER.

Haciendo el cast a un tipo de columna:

También es posible hacer el cast al tipo de columna de una tabla o de una vista. En este caso, solamente el tipo de la columna es usado, ni las restricciones ni los valores por defecto se usan.

CREATE TABLE MiTabla (
    MiColumna INTEGER);

COMMIT;

SELECT CAST(12345 AS TYPE OF COLUMN MiTabla.MiColumna) FROM RDB$DATABASE;

.