CodeGym /Cursos /SQL SELF /Conversión de tipos de datos con CAST() y :: — ejemplos y...

Conversión de tipos de datos con CAST() y :: — ejemplos y peculiaridades

SQL SELF
Nivel 5 , Lección 3
Disponible

Imagínate que quieres sumar dos números, pero uno de los parámetros está guardado como string. O, por ejemplo, quieres filtrar datos por año, pero la fecha la tienes guardada en formato completo con la hora. A PostgreSQL esto no le va a gustar mucho, así que tendrás que intervenir para convertir los datos al tipo correcto.

La conversión de tipos ayuda a:

  • Simplificar el manejo de datos para poder usarlos en cálculos.
  • Crear datos más legibles y estructurados para exportar o analizar.
  • Evitar errores relacionados con incompatibilidad de tipos de datos.

Bases de la conversión de tipos de datos: CAST() y ::

1. CAST() — el hermano mayor de cualquier conversión

La función CAST() es la forma "oficial" de convertir valores de un tipo de dato a otro. Funciona como un traductor universal.

Sintaxis:

CAST(valor AS tipo_de_dato_objetivo)

Ejemplo 1: Convertir string a número.

SELECT CAST('123' AS INTEGER); -- Resultado: 123

Ejemplo 2: Convertir número a string.

SELECT CAST(123 AS TEXT); -- Resultado: '123'

Ejemplo 3: Convertir fecha a string.

SELECT CAST(NOW() AS TEXT); -- Resultado: '2023-10-25 15:00:00.000000'

2. Operador :: — alternativa corta

Si CAST() te parece un poco largo, PostgreSQL te ofrece la sintaxis ::. Es una forma abreviada de convertir, muy popular por su brevedad.

Sintaxis:

valor::tipo_de_dato_objetivo

Ejemplo 1: Convertir string a número.

SELECT '123'::INTEGER; -- Resultado: 123

Ejemplo 2: Convertir número a string.

SELECT 123::TEXT; -- Resultado: '123'

Ejemplo 3: Convertir fecha a string.

SELECT NOW()::TEXT; -- Resultado: '2023-10-25 15:00:00.000000'

Ejemplos reales de uso de conversión de tipos

1. Conversión de números y strings

Supón que tienes una tabla students, donde la columna student_id se guarda como string, pero quieres compararla con un valor numérico. Sin conversión, no va a funcionar.

student_id first_name last_name birth_date grade
101 Alex Lin 2008-03-15 9
102 Maria Chi 2009-07-22 8
103 Axel Ivy 2007-11-30 10
104 Nat Sok 2008-01-18 9
105 Pol Frez 2009-05-05 8

Por eso, en la consulta tienes que convertir explícitamente la columna student_id a número:

SELECT *
FROM students
WHERE student_id::INTEGER = 101;

Consulta equivalente usando CAST():

SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;

Conversión de fechas

Cuando necesitas extraer parte de una fecha o convertirla a string, la conversión de tipos también te salva. Por ejemplo, tienes una tabla courses con fechas de inicio de cursos en la columna start_date.

course_id course_name start_date
1 Introducción a Python 2025-01-15
2 Fundamentos de SQL 2025-03-01
3 Análisis de datos 2025-05-10
4 Desarrollo web 2025-06-20
5 Machine learning 2025-09-05

Ejemplo: Extraer el año como número.

SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;

El resultado será así:

start_date (DATE) start_date (TEXT) start_date (TIMESTAMP)
2025-01-15 2025-01-15 2025-01-15 00:00:00
2025-03-01 2025-03-01 2025-03-01 00:00:00
2025-05-10 2025-05-10 2025-05-10 00:00:00
2025-06-20 2025-06-20 2025-06-20 00:00:00
2025-09-05 2025-09-05 2025-09-05 00:00:00

Ejemplo: Convertir la fecha a "string limpio".

SELECT TO_CHAR(start_date, 'DD-MM-YYYY')

El resultado será así:

to_char
15-01-2025
01-03-2025
10-05-2025
20-06-2025
05-09-2025

Error: ¿Cuándo falla la conversión?

El truco de convertir datos no siempre funciona. A veces PostgreSQL te deja claro que "no entiende" lo que quieres hacer. Aquí tienes un ejemplo clásico: intentas convertir un texto que parece un número, pero el texto tiene caracteres de más.

Ejemplo de error:

SELECT '123abc'::INTEGER;
-- ERROR:  sintaxis de entrada no válida para tipo integer: "123abc"

Para evitar estos problemas, asegúrate de que los datos realmente se pueden convertir al tipo objetivo antes. Por ejemplo, puedes usar expresiones regulares o comprobaciones extra.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION