CAST y CONVERT (Transact-SQL)

Actualizado: 17 de julio de 2006

Convierten una expresión de un tipo de datos en otro de forma explícita. CAST y CONVERT proporcionan funciones similares.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

Syntax for CAST:
CAST ( expression AS data_type [ (length ) ])

Syntax for CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Argumentos

  • data_type
    Es el tipo de datos de destino proporcionado por el sistema. Incluye xml, bigint y sql_variant. No se pueden utilizar tipos de datos de alias. Para obtener más información acerca de los tipos de datos disponibles, vea Tipos de datos (Transact-SQL).
  • length
    Es un parámetro opcional de los tipos de datos nchar, nvarchar, char, varchar, binary o varbinary. Para CONVERT, si no se ha especificado el parámetro length, el valor predeterminado es 30 caracteres.
  • style
    Es el estilo del formato de fecha usado para convertir datos de tipo datetime o smalldatetime en datos de caracteres (con tipo de datos nchar, nvarchar, char, varchar, nchar o nvarchar), o para convertir datos de caracteres de formatos de fecha y hora conocidos en datos de tipo datetime o smalldatetime; o bien, el formato de cadena usado para convertir datos de tipo float, real, money o smallmoney en datos de caracteres (con tipo de datos nchar, nvarchar, char, varchar, nchar o nvarchar). Cuando style es NULL, el resultado devuelto también es NULL.

    [!NOTA] Los estilos que se presentan en la lista de este tema son compatibles con SQL Server en las combinaciones descritas con tipos de datos de destino CONVERT. Todos los otros estilos y combinaciones no son compatibles. No utilice ningún estilo no compatible. Si utiliza un estilo no compatible o una combinación de estilo y tipo de datos de destino no compatible, es posible que se devuelva un error o resultados que no sean de confianza. Estos resultados no se garantizan en todas las versiones de SQL Server.

    SQL Server admite el formato de fecha en estilo árabe gracias al uso del algoritmo Kuwaiti.

    En la siguiente tabla, las dos columnas de la izquierda representan los valores de style para la conversión de los datos datetime o smalldatetime en datos de caracteres. Agregue 100 a un valor de style para obtener un año con cuatro dígitos que incluya el siglo (aaaa).

    Sin el siglo (aa) (1) Con el siglo ?(aaaa) Estándar Entrada/salida (3)

    -

    0 o 100 (1,2)

    Valor predeterminado

    mes dd aaaa hh:mia.m. (o p. m.)

    1

    101

    EE.UU.

    mm/dd/aaaa

    2

    102

    ANSI

    aa.mm.dd

    3

    103

    Británico/Francés

    dd/mm/aa

    4

    104

    Alemán

    dd.mm.aa

    5

    105

    Italiano

    dd-mm-aa

    6

    106(1)

    -

    dd mes aa

    7

    107(1)

    -

    Mes dd, aa

    8

    108

    -

    hh:mi:ss

    -

    9 o 109 (1,2)

    Valor predeterminado + milisegundos

    mes dd aaaa hh:mi:ss:mmma.m. (o p. m.)

    10

    110

    EE.UU.

    mm-dd-aa

    11

    111

    JAPÓN

    aa/mm/dd

    12

    112

    ISO

    aammdd

    -

    13 o 113 (1,2)

    Europeo predeterminado + milisegundos

    dd mes aaaa hh:mi:ss:mmm(24h)

    14

    114

    -

    hh:mi:ss:mmm(24h)

    -

    20 o 120 (2)

    ODBC canónico

    aaaa-mm-dd hh:mi:ss(24h)

    -

    21 o 121 (2)

    ODBC canónico (con milisegundos)

    aaaa-mm-dd hh:mi:ss.mmm(24h)

    -

    126 (4)

    ISO8601

    aaaa-mm-ddThh:mi:ss.mmm (sin espacios)

    127(6, 7)

    ISO8601 con zona horaria Z.

    aaaa-mm-ddThh:mi:ss.mmmZ

    (sin espacios)

    -

    130 (1,2)

    Hijri (5)

    dd mes aaaa hh:mi:ss:mmma.m.

    -

    131 (2)

    Hijri (5)

    dd/mm/aa hh:mi:ss:mmma.m.

    1 Estos valores de estilo devuelven resultados no deterministas. Incluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo).

    2 Los valores predeterminados (style0 o 100, 9 o 109, 13 o 113, 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa).

    3 Entrada cuando se convierte en datetime; salida cuando se convierte en datos de caracteres.

    4 Diseñado para usarse con XML. Para convertir datos datetime o smalldatetime en datos de caracteres, el formato de salida es el descrito en la tabla anterior.

    5 Hijri es un sistema de calendario con varias variaciones. SQL Server 2005 usa el algoritmo Kuwaiti.

    ms187928.note(es-es,SQL.90).gifImportante:
    De manera predeterminada, SQL Server interpreta los años de dos dígitos según el año límite 2049. Es decir, el año 49 de dos dígitos se interpreta como 2049 y el año 50 de dos dígitos se interpreta como 1950. Muchas aplicaciones cliente, como las basadas en objetos de automatización, utilizan como límite el año 2030. SQL Server proporciona la opción de configuración two digit year cutoff que cambia el año límite utilizado por SQL Server y permite el tratamiento coherente de las fechas. Se recomienda especificar años de cuatro dígitos.

    6 Sólo se admite en la conversión de datos de caracteres a datetime o smalldatetime. Cuando se convierten datos de caracteres que representan componentes de sólo fecha o sólo hora al tipo de datos datetime o smalldatetime, el componente de hora no especificado se establece en 00:00:00.000 y el componente de fecha no especificado se establece en 1900-01-01.

    7El indicador opcional de zona horaria, Z, se usa para facilitar la asignación de valores XML de tipo datetime que contienen información de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horaria. Z es el indicador para zona horaria UTC-0. Las otras zonas horarias se indican con un desplazamiento de HH:MM en sentido + o -. Por ejemplo:

    Cuando se convierten datos de caracteres de tipo smalldatetime, los estilos que incluyen segundos o milisegundos muestran ceros en dichas posiciones. Puede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varchar.

    En la siguiente tabla se muestran los valores de style que se pueden utilizar para convertir los datos float o real en datos de caracteres.

    Valor Resultado

    0 (valor predeterminado)

    Un máximo de 6 dígitos. Utilícelo en notación científica cuando proceda.

    1

    Siempre 8 dígitos. Utilícelo siempre en notación científica.

    2

    Siempre 16 dígitos. Utilícelo siempre en notación científica.

    [!NOTA] Si se especifica el estilo 126 para la conversión de float y real, la salida es equivalente a un valor de style igual a 2 y 1, respectivamente.

    En la siguiente tabla se muestran los valores de style que se pueden utilizar para convertir los datos money o smallmoney en datos de caracteres.

    Valor Resultado

    0 (valor predeterminado)

    Sin separadores de millar cada tres dígitos a la izquierda del separador decimal y dos dígitos a la derecha del separador decimal; por ejemplo, 4235,98.

    1

    Separadores de millar cada tres dígitos a la izquierda del separador decimal y dos dígitos a la derecha del separador decimal; por ejemplo, 3.510,92.

    2

    Sin separadores de millar cada tres dígitos a la izquierda del separador decimal y cuatro dígitos a la derecha del separador decimal; por ejemplo, 4235,9819.

    [!NOTA] Si se especifica el estilo 126 para la conversión de money o smallmoney en datos de caracteres, la salida es equivalente a un valor de style igual a 2.

    En la siguiente tabla se muestran los valores de style que se pueden utilizar para convertir entradas de cadena en datos xml.

    Valor

Tipos de valor devueltos

Devuelve el mismo valor que data_type.

Notas

Las conversiones implícitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERT. Las conversiones explícitas son aquellas conversiones que requieren la especificación de las funciones CAST o CONVERT. En la siguiente ilustración se muestran todas las conversiones de tipos de datos explícitas e implícitas permitidas para los tipos de datos proporcionados por el sistema de SQL Server 2005. Incluyen xml, bigint y sql_variant. No existe una conversión implícita en la asignación del tipo de datos sql_variant, pero sí hay una conversión implícita en sql_variant.

Tabla de conversión de tipo de datos

[!NOTA] Puesto que los datos Unicode siempre utilizan un número par de bytes, preste atención al convertir datos binary o varbinary en o desde tipos de datos compatibles con Unicode. Por ejemplo, la siguiente conversión no devuelve el valor hexadecimal 41, sino 4100: SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

Tipos de datos de valor grande

Los tipos de datos de valor grande tienen el mismo comportamiento de conversión implícito y explícito que sus equivalentes más pequeños, especialmente los tipos de datos varchar, nvarchar y varbinary. No obstante, se deben tener en cuenta las siguientes directrices:

  • La conversión de datos image en varbinary(max) y viceversa es una conversión implícita, al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max).
  • La conversión de tipos de datos de valor grande, como varchar(max), en un tipo de datos equivalente más pequeño, como varchar, es una conversión implícita, aunque se producirá truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos más pequeño.
  • La conversión de varchar, nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma implícita.
  • La conversión del tipo de datos sql_variant en los tipos de datos de valor grande es una conversión explícita.
  • Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant.

Para obtener información acerca de la conversión de tipos definidos por el usuario CLR (Common Language Runtime) de Microsoft .NET Framework, vea Realizar operaciones en tipos definidos por el usuario. Para obtener más información acerca de la conversión del tipo de datos xml, vea Generar instancias XML.

xml Data Type

Cuando se convierte de forma explícita o implícita el tipo de datos xml en un tipo de datos de cadena o binario, el contenido del tipo de datos xml se serializa en función de un conjunto de reglas. Para obtener información sobre estas reglas, vea Serialización de datos XML. Para obtener información sobre la conversión del tipo XML al tipo definido por el usuario CLR, vea Realizar operaciones en tipos definidos por el usuario. Para obtener información sobre la conversión de otros tipos de datos al tipo de datos xml, vea Generar instancias XML.

Tipos de datos text e image

No se admite la conversión automática de los tipos de datos text e image. Puede convertir explícitamente datos text en datos de caracteres y datos image en binary o varbinary, pero la longitud máxima es de 8000 bytes. Si intenta una conversión incorrecta, como la de una expresión de caracteres que incluye letras en un tipo int, SQL Server devuelve un mensaje de error.

Intercalación de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra, la salida tiene la misma intercalación y etiqueta de intercalación que la entrada. Si la entrada no es una cadena de caracteres, la salida tiene la intercalación predeterminada de la base de datos y una etiqueta de intercalación coaccionable-predeterminada. Para obtener más información, vea Prioridad de intercalación (Transact-SQL).

Para asignar otra intercalación a la salida, aplique la cláusula COLLATE a la expresión de resultado de las funciones CAST o CONVERT. Por ejemplo:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultados

Al convertir expresiones de caracteres o binarias (char, nchar, nvarchar, varchar, binary o varbinary) en una expresión de un tipo de datos diferente, los datos se pueden truncar, se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostrado. Las conversiones en char, varchar, nchar, nvarchar, binary y varbinary se truncan, excepto aquellas que se muestran en la siguiente tabla.

De tipo de datos En tipo de datos Resultado

int, smallint o tinyint

char

*

 

varchar

*

 

nchar

E

 

nvarchar

E

money, smallmoney, numeric, decimal, float o real

char

E

 

varchar

E

 

nchar

E

 

nvarchar

E

* = Resultado demasiado corto para ser mostrado. E = Error devuelto porque el resultado es demasiado corto para ser mostrado.

SQL Server garantiza que sólo las conversiones circulares, las conversiones que convierten un tipo de datos en otro y después vuelven a convertirlo en el tipo de datos original, devolverán los mismos valores en versiones diferentes. En el siguiente ejemplo se muestra una conversión circular:

DECLARE @myval decimal (5, 2)
SET @myval = 193.57
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))

[!NOTA] No intente crear valores de tipo binary y, a continuación, convertirlos en un tipo de datos de la categoría de tipos de datos numéricos. SQL Server no garantiza que el resultado de una conversión de un tipo de datos decimal o numeric en binary sea el mismo en versiones diferentes de SQL Server.

En el siguiente ejemplo se muestra una expresión resultante demasiado corta para ser mostrada.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName, SUBSTRING(c.Title, 1, 25) AS Title, CAST(e.SickLeaveHours AS char(1)) AS 'Sick Leave'
FROM HumanResources.Employee e JOIN Person.Contact c ON e.EmployeeID = c. ContactID
WHERE NOT EmployeeID >5

Éste es el conjunto de resultados.

FirstName      LastName         Title                  Sick Leave
---------      ---------      -------------------   -----------
Gustavo        Achong         Mr.                   *
Catherine      Abel           Ms.                   *
Kim            Abercrombie    Ms.                   *
Humberto       Acevedo        Sr.                   *
Pilar          Ackerman       Sra.                  *

(5 row(s) affected)

Al convertir tipos de datos que difieren en los decimales, algunas veces el valor resultante se trunca y otras se redondea. En la siguiente tabla se muestra el comportamiento.

De A Comportamiento

numeric

numeric

Redondeo

numeric

int

Truncamiento

numeric

money

Redondeo

money

int

Redondeo

money

numeric

Redondeo

float

int

Truncamiento

float

numeric

Redondeo

float

datetime

Redondeo

datetime

int

Redondeo

Por ejemplo, el resultado de la siguiente conversión es 10:

SELECT CAST(10.6496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen, el valor se redondea. Por ejemplo, el resultado de la siguiente conversión es $10.3497:

SELECT CAST(10.3496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos de tipo char, nchar, varchar o nvarchar no numéricos en datos de tipo int, float, numeric o decimal. SQL Server también devuelve un error cuando una cadena vacía (" ") se convierte en datos de tipo numeric o decimal.

Convertir datos de cadenas binarias

Cuando se convierten datos binary o varbinary en datos de caracteres y se especifica un número impar de valores a continuación de la x, SQL Server agrega un 0 (cero) después de la x para tener un número par de valores.

Los datos de tipo binary se componen de los caracteres del 0 al 9 y de la A a la F, o de la a a la f, en grupos de dos caracteres cada uno. Las cadenas binarias tienen que estar precedidas por 0x. Por ejemplo, para especificar FF, escriba 0xFF. El valor máximo es un valor binario de 8000 bytes, cada uno de los cuales es FF. Los tipos de datos binary no son para datos hexadecimales, sino para patrones de bits. Puede que las conversiones y los cálculos de números hexadecimales almacenados como datos de tipo binary no sean de confianza.

Cuando se especifica la longitud de un tipo de datos binary, cada dos caracteres cuentan como uno. La longitud 10 significa que se van a especificar 10 grupos de dos caracteres.

Las cadenas binarias vacías están representadas por 0x y se pueden almacenar como datos de tipo binary.

Ejemplos

A. Utilizar CAST y CONVERT

En cada ejemplo se recupera el nombre de aquellos productos que tienen un 3 como primer dígito del precio y se convierte ListPrice en int.

-- Use CAST
USE AdventureWorks;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS int) LIKE '3%';
GO

-- Use CONVERT.
USE AdventureWorks;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CONVERT(int, ListPrice) LIKE '3%';
GO

B. Utilizar CAST con operadores aritméticos

En el siguiente ejemplo se calcula una única columna (Computed) mediante la división de las ventas anuales hasta la fecha (SalesYTD) entre el porcentaje de la comisión (CommissionPCT). El resultado se convierte en un tipo de datos int después de redondearlo al número entero más próximo.

USE AdventureWorks;
GO
SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS 'Computed'
FROM Sales.SalesPerson 
WHERE CommissionPCT != 0;
GO

Éste es el conjunto de resultados.

Computed      
------ 
379753754
346698349
257144242
176493899
281101272
0
301872549
212623750
298948202
250784119
239246890
101664220
124511336
97688107

(14 row(s) affected)

C. Utilizar CAST para concatenar

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST.

USE AdventureWorks;
GO
SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice
FROM Production.Product
WHERE ListPrice BETWEEN 350.00 AND 400.00;
GO

Éste es el conjunto de resultados.

ListPrice
------------------
The list price is 357.06
The list price is 364.09
The list price is 364.09
The list price is 364.09
The list price is 364.09

(5 row(s) affected)

D. Utilizar CAST para obtener texto más legible

En el siguiente ejemplo se utiliza CAST en la lista de selección para convertir la columna Name en una columna de tipo char(10).

USE AdventureWorks;
GO
SELECT DISTINCT CAST(p.Name AS char(10)) AS Name, s.UnitPrice
FROM Sales.SalesOrderDetail s JOIN Production.Product p on s.ProductID = p.ProductID
WHERE Name LIKE 'Long-Sleeve Logo Jersey, M';
GO

Éste es el conjunto de resultados.

Name       UnitPrice
---------- ---------------------
Long-Sleev 31.2437
Long-Sleev 32.4935
Long-Sleev 49.99

(3 row(s) affected)

E. Utilizar CAST con la cláusula LIKE

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y, a continuación, en una de tipo char(20) para que se pueda utilizar con la cláusula LIKE.

USE AdventureWorks;
GO
SELECT p.FirstName, p.LastName, s.SalesYTD, s.SalesPersonID
FROM Person.Contact p JOIN Sales.SalesPerson s ON p.ContactID = s.SalesPersonID
WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%';
GO

Éste es el conjunto de resultados.

FirstName        LastName            SalesYTD         SalesPersonID
---------------- ------------------- ---------------- -------------
Carol            Elliott             2811012.7151      279
Julie            Estes               219088.8836       288
Janeth           Esteves             2241204.0424      289

(3 row(s) affected)

F. Utilizar CONVERT o CAST con XML con tipo

A continuación se incluyen varios ejemplos en los que se muestra el uso de CONVERT para convertir XML con tipo mediante el tipo de datos xml.

En este ejemplo se convierte una cadena con espacios en blanco, texto y marcado en XML con tipo y se quitan todos los espacios en blanco insignificantes (espacios en blanco de límite entre los nodos):

CONVERT(XML, '<root><child/></root>')

En este ejemplo se convierte una cadena similar con espacios en blanco, texto y marcado en XML con tipo y se conservan los espacios en blanco insignificantes (espacios en blanco de límite entre los nodos):

CONVERT(XML, '<root>          <child/>         </root>', 1)

En este ejemplo se convierte una cadena con espacios en blanco, texto y marcado en XML con tipo:

CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>'  AS XML)

Para obtener más ejemplos, vea Generar instancias XML.

G. Utilizar CAST y CONVERT con datos de fecha y hora

En el ejemplo siguiente se muestra la fecha y la hora actuales, se utiliza CAST para cambiarlas a un tipo de datos de carácter y, a continuación, se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901.

SELECT 
   GETDATE() AS UnconvertedDateTime,
   CAST(GETDATE() AS nvarchar(30)) AS UsingCast,
   CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601  ;
GO

Éste es el conjunto de resultados.

UnconvertedDateTime     UsingCast                      UsingConvertTo_ISO8601

----------------------- ------------------------------ ------------------------------

2006-04-18 09:58:04.570 Apr 18 2006 9:58AM            2006-04-18T09:58:04.570

(1 row(s) affected)

El siguiente ejemplo es lo opuesto, aproximadamente, del ejemplo anterior. En el ejemplo se muestra la fecha y la hora como datos de carácter, se utiliza CAST para cambiar los datos de carácter al tipo de datos datetime y, a continuación, se utiliza CONVERT para cambiar los datos de carácter al tipo de datos datetime.

SELECT 
   '2006-04-04T15:50:59.997' AS UnconvertedText,
   CAST('2006-04-04T15:50:59.997' AS datetime) AS UsingCast,
   CONVERT(datetime, '2006-04-04T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;
GO

Éste es el conjunto de resultados.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601

----------------------- ----------------------- ------------------------

2006-04-04T15:50:59.997 2006-04-04 15:50:59.997 2006-04-04 15:50:59.997

(1 row(s) affected)

Vea también

Referencia

SELECT (Transact-SQL)
Funciones del sistema (Transact-SQL)

Otros recursos

Conversiones de tipos de datos (motor de base de datos)
Formato ISO 8601
Escribir instrucciones Transact-SQL internacionales

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial

17 de julio de 2006

Contenido nuevo:
  • Se agregó el ejemplo G.

14 de abril de 2006

Contenido nuevo:
  • Se ha agregado la descripción del indicador de zona horaria Z para el estilo 127.