Funciones de conversión de tipos, CAST

Cuando hacemos operaciones con valores de distintos tipos de datos, el SGBD intenta convertirlos al tipo necesario. Por ejemplo, abajo comparamos valores de tipo STRING e INT. Para hacer esta comparación, el SGBD convierte automáticamente el valor de cadena en un valor numérico.

MySQL 8.4
SELECT '50' > 49 AS comparison_1, '50' > 51 AS comparison_2;
comparison_1comparison_2
10
MySQL 8.4
SELECT '50' > 49 AS comparison_1, '50' > 51 AS comparison_2;
comparison_1comparison_2
truefalse

Pero el SGBD no puede hacer todas las conversiones automáticamente, y en esos casos hay que convertir el tipo de forma explícita.

Para ello, MySQL tiene dos funciones muy parecidas: CAST y CONVERT.

Para ello, PostgreSQL tiene la función CAST y el operador ::.

Sintaxis

MySQL 8.4
CAST(valor AS tipo)
CONVERT(valor, tipo)
valor

Lo que hay que convertir: un número, una cadena, una fecha o una columna de una tabla.

tipo

El tipo al que se convierte el valor. Los tipos disponibles aparecen más abajo.

Por ejemplo:

MySQL 8.4
SELECT CAST(12005.6 AS DECIMAL) AS cast_example, CONVERT(12005.4, DECIMAL) AS convert_example;
cast_exampleconvert_example
1200612005
MySQL 8.4
CAST(valor AS tipo)
valor::tipo
valor

Lo que hay que convertir: un número, una cadena, una fecha o una columna de una tabla.

tipo

El tipo al que se convierte el valor. Los tipos disponibles aparecen más abajo.

Por ejemplo:

MySQL 8.4
SELECT CAST(12005.6 AS INTEGER) AS cast_example, 12005.4::INTEGER AS operator_example;
cast_exampleoperator_example
1200612005

La función CAST puede convertir el valor que recibe en cualquiera de los siguientes tipos:

TipoDescripción
DATEConvierte el valor en DATE. Formato: «YYYY-MM-DD».
DATETIMEConvierte el valor en DATETIME. Formato: «YYYY-MM-DD hh:mm:ss».
TIMEConvierte el valor en TIME. Formato: «hh:mm:ss».
DECIMAL[(M[,D])]Convierte el valor en DECIMAL. Tiene dos argumentos opcionales, M y D, que definen el número máximo de dígitos antes y después de la coma, respectivamente. Por defecto, D es 0 y M es 10.
CHAR[(N)]Convierte el valor en CHAR. Como argumento opcional se puede pasar la longitud máxima de la cadena.
SIGNEDConvierte el valor en un valor BIGINT.
UNSIGNEDConvierte el valor en un valor BIGINT sin signo.
BINARYConvierte el valor en BINARY.
YEARConvierte el valor en un año.

La función CAST puede convertir el valor que recibe en cualquiera de los siguientes tipos:

TipoDescripción
DATEConvierte el valor en DATE. Formato: «YYYY-MM-DD».
TIMESTAMPConvierte el valor en TIMESTAMP. Formato: «YYYY-MM-DD hh:mm:ss».
TIMEConvierte el valor en TIME. Formato: «hh:mm:ss».
NUMERIC[(M[,D])]Convierte el valor en NUMERIC. Tiene dos argumentos opcionales, M y D, que definen el número máximo de dígitos antes y después de la coma, respectivamente.
VARCHAR[(N)]Convierte el valor en VARCHAR. Como argumento opcional se puede pasar la longitud máxima de la cadena.
INTEGERConvierte el valor en un número entero.
BIGINTConvierte el valor en un número entero grande.
BOOLEANConvierte el valor en un tipo booleano.
TEXTConvierte el valor en un tipo de texto.

No todo se puede convertir

La función CAST exige que el valor de origen tenga un formato concreto. Y enseguida surge la pregunta: ¿qué pasa si ese formato no es el necesario? Por ejemplo, si intentas convertir un texto cualquiera en un tipo de datos de fecha y hora:

MySQL 8.4
SELECT CAST('SQL Academy' AS DATETIME) AS invalid_cast;
invalid_cast
<NULL>

En este caso, MySQL devolverá NULL en lugar del valor convertido.

MySQL 8.4
SELECT CAST('SQL Academy' AS TIMESTAMP) AS invalid_cast;

En este caso, PostgreSQL devolverá un error, porque la cadena no se puede convertir en una fecha.

Autoevaluación

Entonces, ¿para qué sirve la función CAST en SQL? 🧐