¿Cómo convertir el formato de fecha a entero en SQL?

Convierte nvarchar a int en SQL: Guía Completa

Valoración: 3.91 (6694 votos)

En el mundo de las bases de datos, es común encontrarse con situaciones donde los datos no están en el formato deseado. Una tarea frecuente es convertir una cadena de texto, almacenada en un tipo de dato como nvarchar, a un número entero, representado por el tipo de dato int. Esta conversión es esencial para realizar operaciones matemáticas, comparaciones numéricas o simplemente para asegurar la integridad y el formato correcto de tus datos.

SQL (Structured Query Language) nos proporciona varias herramientas poderosas para realizar esta conversión de tipos de datos. Las funciones más utilizadas para este propósito son CAST, CONVERT, TRY_CAST y TRY_CONVERT. Cada una tiene sus particularidades y su forma de manejar situaciones, especialmente cuando los datos de origen no son numéricos válidos.

¿Cómo puedo convertir una fecha a un número en SQL?
Para devolver el año -como un número de 1000 a 9990- a partir de una fecha o una marca de tiempo, utilice la función YEAR como YEAR(date_value). Por ejemplo, SELECT YEAR("2020-06-15") devuelve 2020.3 nov 2023

Comprender cómo y cuándo usar cada una de estas funciones es crucial para escribir consultas eficientes y robustas que no fallen inesperadamente debido a errores de conversión. A continuación, exploraremos en detalle cada uno de estos métodos, sus sintaxis, ejemplos prácticos y cómo elegir la mejor opción para tu necesidad específica.

Índice de Contenido

Métodos para Convertir nvarchar a int en SQL

Existen diversas aproximaciones para transformar una cadena de texto que representa un número en un valor numérico entero. La elección del método dependerá principalmente de cómo deseas manejar los posibles errores que surjan si la cadena no puede ser interpretada como un número.

Uso de CAST para convertir nvarchar a int

La función CAST es un método estándar ANSI-SQL para convertir un valor de un tipo de dato a otro. Es la opción más portable entre diferentes sistemas de gestión de bases de datos (DBMS) que cumplen con el estándar SQL.

La sintaxis básica de CAST es simple:

SELECT CAST(columna_nvarchar AS INT) AS ColumnaConvertida FROM NombreTabla;

Esta función toma el valor de la `columna_nvarchar` y trata de convertirlo al tipo de dato `INT`. Si todos los valores en la columna son cadenas numéricas válidas (por ejemplo, '123', '-45'), la conversión se realizará sin problemas.

Sin embargo, si la columna contiene cualquier valor que no pueda ser interpretado como un número entero válido (por ejemplo, 'abc', '123a', '', ' '), la función CAST generará un error de conversión. Esto puede detener la ejecución de tu consulta o procedimiento, lo cual no siempre es el comportamiento deseado.

Ejemplo con CAST:

Consideremos una tabla llamada `Productos` con una columna `PrecioTexto` de tipo NVARCHAR que almacena precios como cadenas.

CREATE TABLE Productos ( ProductoID INT, PrecioTexto NVARCHAR(50) ); INSERT INTO Productos (ProductoID, PrecioTexto) VALUES (1, '100'), (2, '250'), (3, 'Gratis'), (4, '50');

Ahora, intentemos convertir `PrecioTexto` a INT usando CAST:

SELECT ProductoID, PrecioTexto, CAST(PrecioTexto AS INT) AS PrecioNumerico FROM Productos;

Resultado esperado:

ProductoID | PrecioTexto | PrecioNumerico -----------|-------------|--------------- 1 | '100' | 100 2 | '250' | 250 3 | 'Gratis' | -- Error de conversión -- 4 | '50' | 50

La consulta fallará al intentar procesar la fila con 'Gratis'.

Uso de CONVERT para convertir nvarchar a int

La función CONVERT es similar a CAST pero es específica de algunos sistemas de bases de datos como SQL Server y Sybase. Ofrece funcionalidades adicionales, como la capacidad de especificar un 'estilo' para formatear datos, aunque esto es más relevante para conversiones de fecha/hora o numéricas con decimales.

La sintaxis de CONVERT es ligeramente diferente:

SELECT CONVERT(INT, columna_nvarchar) AS ColumnaConvertida FROM NombreTabla;

Al igual que CAST, CONVERT también generará un error si el valor de entrada no puede ser convertido al tipo de dato de destino (INT en este caso).

Ejemplo con CONVERT:

Usando la misma tabla `Productos`:

SELECT ProductoID, PrecioTexto, CONVERT(INT, PrecioTexto) AS PrecioNumerico FROM Productos;

Resultado esperado:

ProductoID | PrecioTexto | PrecioNumerico -----------|-------------|--------------- 1 | '100' | 100 2 | '250' | 250 3 | 'Gratis' | -- Error de conversión -- 4 | '50' | 50

De nuevo, la consulta fallará por el mismo motivo que con CAST.

Manejo de Datos No Compatibles con TRY_CAST y TRY_CONVERT

Como hemos visto, CAST y CONVERT son estrictos y provocan errores ante datos inválidos. En muchos escenarios, preferiríamos que la conversión simplemente fallara "silenciosamente" para filas específicas, quizás devolviendo un valor nulo, en lugar de detener toda la consulta.

Para esto, SQL Server (a partir de la versión 2012) introdujo las funciones TRY_CAST y TRY_CONVERT.

TRY_CAST

La función TRY_CAST funciona igual que CAST, pero si la conversión falla, devuelve NULL en lugar de generar un error.

Sintaxis:

SELECT TRY_CAST(columna_nvarchar AS INT) AS ColumnaConvertida FROM NombreTabla;

TRY_CONVERT

De manera similar, TRY_CONVERT funciona como CONVERT, devolviendo NULL si la conversión no es posible.

Sintaxis:

SELECT TRY_CONVERT(INT, columna_nvarchar) AS ColumnaConvertida FROM NombreTabla;

Ejemplo con TRY_CAST:

Usando la tabla `Productos` nuevamente:

SELECT ProductoID, PrecioTexto, TRY_CAST(PrecioTexto AS INT) AS PrecioNumerico FROM Productos;

Resultado:

ProductoID | PrecioTexto | PrecioNumerico -----------|-------------|--------------- 1 | '100' | 100 2 | '250' | 250 3 | 'Gratis' | NULL 4 | '50' | 50

¡Ahora la consulta se ejecuta sin errores! La fila con 'Gratis' simplemente resulta en NULL para la columna `PrecioNumerico`.

Ejemplo con TRY_CONVERT:

El comportamiento es idéntico al usar TRY_CONVERT:

SELECT ProductoID, PrecioTexto, TRY_CONVERT(INT, PrecioTexto) AS PrecioNumerico FROM Productos;

Resultado:

ProductoID | PrecioTexto | PrecioNumerico -----------|-------------|--------------- 1 | '100' | 100 2 | '250' | 250 3 | 'Gratis' | NULL 4 | '50' | 50

TRY_CAST y TRY_CONVERT son ideales cuando trabajas con datos potencialmente "sucios" o inconsistentes y quieres procesar las filas válidas sin que las inválidas detengan tu consulta.

Conversión Segura con ISNUMERIC y CAST/CONVERT

Antes de la existencia de TRY_CAST y TRY_CONVERT (o si estás trabajando en un sistema de base de datos que no los soporta), una técnica común para evitar errores era usar la función ISNUMERIC junto con CAST o CONVERT.

La función ISNUMERIC verifica si una expresión es un tipo numérico válido. Devuelve 1 si lo es y 0 si no. Sin embargo, hay que tener precaución: ISNUMERIC puede devolver 1 para cadenas que CAST/CONVERT no pueden convertir a INT (por ejemplo, '.', ',', '123e4', '$1'). Para una conversión estricta a INT, es más fiable usar TRY_CAST/TRY_CONVERT.

A pesar de sus limitaciones, ISNUMERIC puede ser útil para filtrar *algunos* valores claramente no numéricos antes de intentar la conversión.

Sintaxis:

SELECT CAST(columna_nvarchar AS INT) AS ColumnaConvertida FROM NombreTabla WHERE ISNUMERIC(columna_nvarchar) = 1;

o

SELECT CONVERT(INT, columna_nvarchar) AS ColumnaConvertida FROM NombreTabla WHERE ISNUMERIC(columna_nvarchar) = 1;

Esta consulta solo intentará la conversión para las filas donde ISNUMERIC devuelva 1.

Ejemplo con ISNUMERIC y CAST:

Usando la tabla `Productos`:

SELECT ProductoID, PrecioTexto, CAST(PrecioTexto AS INT) AS PrecioNumerico FROM Productos WHERE ISNUMERIC(PrecioTexto) = 1;

Resultado:

ProductoID | PrecioTexto | PrecioNumerico -----------|-------------|--------------- 1 | '100' | 100 2 | '250' | 250 4 | '50' | 50

En este caso, la fila con 'Gratis' es excluida completamente del resultado porque ISNUMERIC('Gratis') devuelve 0. Si tuvieras valores como '123.45', ISNUMERIC devolvería 1, pero CAST('123.45' AS INT) seguiría generando un error. Por eso, TRY_CAST/TRY_CONVERT suelen ser preferibles si están disponibles.

Consideraciones Adicionales y Trucos

Al convertir de nvarchar a int, ten en cuenta lo siguiente:

  • Espacios en blanco: Las funciones de conversión suelen manejar automáticamente los espacios en blanco iniciales y finales. Por ejemplo, CAST(' 123 ' AS INT) generalmente resultará en 123. Sin embargo, espacios intermedios ('1 2 3') o caracteres no numéricos harán que la conversión falle.
  • Cadenas vacías: Una cadena vacía ('') generalmente no se considera un número válido y causará un error con CAST/CONVERT o devolverá NULL con TRY_CAST/TRY_CONVERT. Puedes usar una condición `WHERE columna_nvarchar <> ''` si necesitas excluirlas antes de la conversión.
  • NULLs: Si la columna `nvarchar` contiene valores NULL, la conversión de NULL a INT resultará en NULL. Esto es un comportamiento estándar y no genera errores.
  • Rangos numéricos: Asegúrate de que el número representado por la cadena esté dentro del rango válido para el tipo de dato INT. Si la cadena representa un número demasiado grande o demasiado pequeño, la conversión fallará.

Tabla Comparativa de Métodos

MétodoEstándar SQLManejo de ErrorValor en caso de ErrorDisponibilidad (SQL Server)
CASTSí (ANSI-SQL)Genera ErrorNinguno (falla la consulta)Todas las versiones
CONVERTNo (específico del proveedor)Genera ErrorNinguno (falla la consulta)Todas las versiones
TRY_CASTSí (ANSI-SQL)No genera ErrorNULLSQL Server 2012+
TRY_CONVERTNo (específico del proveedor)No genera ErrorNULLSQL Server 2012+
ISNUMERIC + CAST/CONVERTISNUMERIC no es estándarPuede evitar algunos errores, pero no todosExcluye la fila (con WHERE)Todas las versiones

Como puedes ver, TRY_CAST y TRY_CONVERT ofrecen una forma más elegante y robusta de manejar datos sucios sin interrumpir el flujo de tu consulta, siempre y cuando trabajes en un entorno que los soporte.

Preguntas Frecuentes (FAQ)

¿Cuándo debería usar CAST en lugar de CONVERT?

Generalmente, se prefiere CAST porque es parte del estándar ANSI-SQL, lo que hace que tu código sea más portable entre diferentes sistemas de bases de datos. CONVERT es útil si necesitas usar las opciones de 'estilo' que ofrece (aunque para `nvarchar` a `int` no hay estilos relevantes) o si trabajas exclusivamente con un sistema como SQL Server.

¿TRY_CAST y TRY_CONVERT son lo mismo?

Para la conversión de nvarchar a int sin estilos, TRY_CAST y TRY_CONVERT se comportan de manera idéntica: intentan la conversión y devuelven NULL si falla. La principal diferencia es que TRY_CAST es estándar ANSI-SQL, mientras que TRY_CONVERT es específico de SQL Server/Sybase.

¿ISNUMERIC es suficiente para validar si una cadena se puede convertir a INT?

No completamente. ISNUMERIC puede devolver 1 para cadenas que CAST o CONVERT no pueden convertir a INT (como decimales, notación científica, símbolos monetarios). Para una validación precisa antes de convertir a INT, especialmente si no puedes usar TRY_CAST/TRY_CONVERT, necesitarías validaciones más complejas usando patrones (como `LIKE` o expresiones regulares si tu sistema las soporta) o manejar los errores de conversión.

¿Qué pasa si la cadena nvarchar está vacía ('')?

Una cadena vacía no es un número válido. CAST y CONVERT generarán un error. TRY_CAST y TRY_CONVERT devolverán NULL. ISNUMERIC(' ') devuelve 0 (en SQL Server), mientras que ISNUMERIC('') también devuelve 0, por lo que las filas con cadenas vacías no pasarán un filtro `WHERE ISNUMERIC(...) = 1`.

¿Puedo convertir nvarchar con decimales (ej. '123.45') directamente a INT?

Sí, puedes intentar la conversión. CAST('123.45' AS INT) y CONVERT(INT, '123.45') funcionarán en SQL Server, truncando la parte decimal (resultando en 123). TRY_CAST y TRY_CONVERT también lo harán y devolverán 123 si la cadena es un decimal válido. Sin embargo, si la cadena tiene más de un punto decimal o caracteres no numéricos, fallarán o devolverán NULL. Ten en cuenta que esto es un *truncamiento*, no un redondeo.

Conclusión

Convertir datos de nvarchar a int es una operación fundamental en la gestión de bases de datos. SQL ofrece múltiples caminos para lograrlo, cada uno con sus pros y contras.

Las funciones CAST y CONVERT son las opciones tradicionales, útiles cuando estás seguro de que tus datos de entrada son limpios y numéricos, o cuando deseas que la consulta falle si encuentra datos inválidos. Sin embargo, su comportamiento ante errores puede ser problemático en entornos con datos inconsistentes.

Las funciones TRY_CAST y TRY_CONVERT (disponibles en SQL Server 2012 y posteriores) representan una mejora significativa, permitiendo manejar errores de conversión de manera elegante al devolver NULL. Son la opción recomendada para una conversión más segura y tolerante a fallos.

Finalmente, usar ISNUMERIC en conjunto con CAST o CONVERT puede ser una estrategia de pre-validación en sistemas más antiguos, aunque debes ser consciente de sus limitaciones y la posibilidad de que algunos valores que ISNUMERIC considera numéricos aún fallen al convertirse a INT.

La elección del método adecuado dependerá de la limpieza de tus datos, la versión de tu base de datos y cómo prefieres manejar los errores de conversión. Al comprender estas opciones, puedes escribir consultas SQL más robustas y confiables.

Si quieres conocer otros artículos parecidos a Convierte nvarchar a int en SQL: Guía Completa puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir