Sybase Technical Library - Product Manuals Home
[Search Forms] [Previous Section with Hits] [Next Section with Hits] [Clear Search] Expand Search

Funciones de fecha [Table of Contents] Chapter 11: Creación de índices en tablas

Transact-SQL User's Guide (Spanish)

[-] Chapter 10: Uso de funciones incorporadas en consultas
[-] Funciones de conversión de tipos de datos

Funciones de conversión de tipos de datos

Las conversiones de tipo de datos cambian una expresión de un tipo de datos a otro y vuelve a dar formato a la información de fecha y hora. SQL Server realiza determinadas conversiones de tipo de datos de forma automática, que reciben el nombre de conversiones implícitas. Por ejemplo, si compara una expresión char y otra datetime , o una expresión smallint y otra int , o expresiones char de longitudes diferentes, SQL Server convierte automáticamente un tipo de datos a otro.

Otras conversiones de tipo de datos deben solicitarse de forma explícita, utilizando una de las funciones de conversión de tipos de datos incorporadas. Por ejemplo, antes de concatenar expresiones numéricas, es necesario convertirlas a expresiones de caracteres.

SQL Server proporciona tres funciones de conversión de tipos de datos, convert , inttohex y hextoint . Estas funciones pueden emplearse en la lista select , la cláusula where y cualquier lugar donde se permita una expresión.

SQL Server no permite convertir ciertos tipos de datos a otros tipos de datos, ni de forma implícita ni explícita. Por ejemplo, no se pueden convertir datos smallint a datetime , ni datos datetime a smallint . Las conversiones no admitidas generan mensajes de error.

Conversiones soportadas

La Figura 10-1: Conversiones de tipos de datos implícitas, explícitas y no soportadas resume las conversiones de tipos de datos soportadas por SQL Server:

Uso de la función de conversión general: convert

La función de conversión general, convert , se utiliza para realizar conversiones entre una amplia variedad de tipos de datos y especificar un nuevo formato de visualización para la información de fecha y hora. Su sintaxis es:

 convert(  datatype, expression   [,   style  ] )  

A continuación se muestra un ejemplo que emplea convert en la lista de selección:

 select title, convert(char(5), total_sales)  
from titles
where type = "trad_cook"
 title  
------------------------------------ -----
Onions, Leeks, and Garlic: Cooking
Secrets of the Mediterranean 125
Fifty Years in Buckingham Palace
Kitchens 15096
Sushi, Anyone? 5405

(3 rows affected)

En este ejemplo, la columna total_sales , una columna int , se convierte a una columna char (5) para que pueda utilizarse con la palabra clave like :

 select title, total_sales  
from titles
where convert(char(5), total_sales) like "15%"
and type = "trad_cook"
 title  
--------------------------------- -----
Fifty Years in Buckingham Palace
Kitchens 15096

(1 row affected)

Algunos tipos de datos esperan una longitud o una precisión y escala. Si no especifica una longitud, SQL Server utiliza la longitud predeterminada 30 para los datos de caracteres y binarios. Si no especifica una precisión o escala, SQL Server utiliza los valores predeterminados 18 y 0, respectivamente.

Reglas de conversión

En las siguientes secciones se describen las reglas que SQL Server tiene en cuenta al convertir tipos diferentes de información:

Conversión de datos de caracteres a un tipo de datos no de caracteres

Los datos de caracteres pueden convertirse a un tipo de datos no de caracteres (como el monetario, fecha y hora, numérico exacto o numérico aproximado) si se componen totalmente de caracteres que son válidos para el tipo nuevo. Los espacios en blanco iniciales se ignoran.

Los errores de sintaxis se generan cuando los datos incluyen caracteres inaceptables. Los siguientes son algunos ejemplos de caracteres que pueden generar errores de sintaxis:

Conversión de un tipo de caracteres a otro

Al convertir de un juego de caracteres multibyte a otro de un solo byte, los caracteres sin un equivalente de un solo byte se convierten en espacios en blanco.

Las columnas text pueden convertirse explícitamente a char, nchar , varchar o nvarchar . El límite viene determinado por la longitud máxima de los tipos de datos de caracteres, 255 bytes. Si no especifica la longitud, el valor convertido tiene una longitud predeterminada de 30 bytes.

Conversión de números a un tipo de caracteres

Los datos numéricos exactos y aproximados pueden convertirse a un tipo de caracteres. Si el tipo nuevo es demasiado corto para albergar la cadena completa, se genera un error de espacio insuficiente. Por ejemplo, la siguiente conversión intenta almacenar una cadena de 5 caracteres en un tipo de 1 carácter:

 select convert(char(1), 12.34) 
 Espacio de resultado insuficiente para la conversión explícita del valor NUMERIC '12.34' en un campo CHAR. 

Redondeo durante la conversión con tipos monetarios

Los tipos money y smallmoney almacenan cuatro dígitos a la derecha del punto decimal, pero redondean hasta la centena más próxima (.01) para fines de visualización. Cuando los datos se convierten a un tipo monetario, se redondean hasta cuatro posiciones.

Si es posible, los datos convertidos de un tipo monetario siguen el mismo comportamiento de redondeo. Si el tipo nuevo es un numérico exacto con menos de tres posiciones decimales, los datos se redondean a la escala del tipo nuevo. Por ejemplo, cuando $4.50 se convierte a un valor entero, el resultado es 4:

 select convert(int, $4.50) 
 -----------  
4

Los datos convertidos a money o smallmoney se supone que están en unidades monetarias completas, como dólares, en lugar de unidades fraccionarias, como céntimos. Por ejemplo, el valor entero 4 se convertiría al equivalente monetario de 4 dólares, no 4 céntimos, en us_english.

Conversión de información de fecha y hora

Los datos que son reconocibles como una fecha pueden convertirse a datetime o smalldatetime . Los nombres de meses incorrectos provocan errores de sintaxis. Las fechas que se encuentran fuera del margen aceptable del tipo de datos generan errores de desbordamiento aritmético.

Cuando los valores datetime se convierten a smalldatetime , se redondean al minuto más próximo.

Conversión entre tipos numéricos

Los datos pueden convertirse de un tipo numérico a otro. Si el tipo nuevo es un numérico exacto cuya precisión o escala no es suficiente para albergar los datos, se pueden producir errores. Use las opciones arithabort y arithignore se para determinar el modo en que se manipulan estos errores.

Note: Las opciones arithabort y arithignore se han redefinido para SQL Server, Versión 10.0. Si utiliza estas opciones en sus aplicaciones, examínelas para asegurarse de que todavía funcionan correctamente.

Conversión de datos de tipo binario

Los datos binary y varbinary de SQL Server son específicos de la plataforma; el tipo de hardware que se utiliza determina el modo en que se almacenan e interpretan los datos. Algunas plataformas consideran el primer byte después del prefijo 0x como el más significativo; otras consideran el primer byte como el menos significativo.

La función convert trata los datos binarios de Sybase como si fueran una cadena de caracteres, en lugar de información numérica. convert no tiene en cuenta la importancia del orden de los bytes al convertir una expresión binaria a un valor entero o una expresión de número entero a un valor binario. Debido a esto, los resultados de la conversión pueden variar de una plataforma a otra.

Antes de convertir una cadena binaria a un número entero, convert elimina su prefijo 0x. Si la cadena se compone de un número de dígitos impar, SQL Server inserta un cero inicial. Si los datos son demasiado largos para el tipo entero, convert los trunca. Si los datos son demasiado cortos, convert los justifica a la derecha y los rellena con ceros.

Supongamos que se quiere convertir la cadena 0x00000100 a un número entero. En algunas plataformas, esta cadena representa el número 1; en otras, el número 256. Dependiendo de la plataforma que ejecute la función, convert devuelve 1 o 256 en otras.

Conversión de datos hexadecimales

Para los resultados de conversión que son fiables a través de plataformas, utilice las funciones hextoint e inttohex .

hextoint acepta literales o variables que se componen de dígitos y las letras de la A a la F en mayúsculas y minúsculas, con o sin un prefijo 0x. Estos son usos válidos de hextoint :

 hextoint("0x00000100FFFFF") 
hextoint("0x00000100")
hextoint("100")

hextoint elimina el prefijo 0x. Si los datos superan los ocho dígitos, hextoint los trunca. Si los datos tienen menos de ocho dígitos, hextoint los justifica a la derecha y los rellena con ceros. A continuación, hextoint devuelve el valor entero equivalente independiente de la plataforma. Las expresiones descritas anteriormente devuelven el mismo valor, 256, independientemente de la plataforma que ejecute la función hextoint .

La función inttohex acepta datos de valor entero y devuelve una cadena hexadecimal de 8 caracteres sin prefijo 0x. inttohex siempre devuelve los mismos resultados, independientemente de la plataforma que se esté utilizando.

Conversión de datos image a binary o varbinary

La función convert se puede utilizar para convertir una columna image a binary o varbinary . Los tipos de datos binary tienen una longitud máxima, que es de 255 bytes. Si no se especifica la longitud, el valor convertido tiene una longitud predeterminada de 30 caracteres.

Errores de conversión

En las siguientes secciones se describen los tipos de errores que pueden producirse durante las conversiones de tipos de datos.

Errores de desbordamiento aritmético y de división por cero

Los errores de división por cero se producen cuando SQL Server intenta dividir un valor numérico por cero. Los errores de desbordamiento aritmético se generan cuando las posiciones decimales del tipo nuevo no son suficientes para albergar los resultados. Esto ocurre durante:

Los errores de desbordamiento aritmético y de división por cero se consideran graves, independientemente de que se produzcan durante conversiones implícitas o explícitas. Use la opción arithabort arith_overflow para determinar el modo en que SQL Server manipula estos errores. El valor predeterminado, arithabort arith_overflow on , revierte toda la transacción o lote donde se genera el error. Si define arithabort arith_overflow off , SQL Server aborta la instrucción que origina el error, pero continúa procesando otras instrucciones de la transacción o lote. Puede utilizar la variable global @@error para verificar los resultados de la instrucción.

Utilice la opción arithignore arith_overflow para determinar si SQL Server muestra un mensaje después de estos errores. El valor predeterminado, off , muestra un mensaje de advertencia cuando se produce un error de división por cero o una pérdida de precisión. La definición de arithignore arith_overflow on suprime los mensajes de advertencia tras estos errores. La palabra clave arith_overflow puede omitirse sin efecto alguno.

Errores de escala

Cuando los resultados de una conversión explícita originan una pérdida de escala, los resultados se truncan sin ninguna advertencia. Por ejemplo, cuando convierte explícitamente un tipo numérico float , numeric o decimal a un integer , SQL Server supone que en realidad desea que el resultado sea un número entero y trunca todos los números a la derecha del punto decimal.

Durante las conversiones implícitas a tipos numeric o decimal , la pérdida de escala genera un error de escala. Use la opción arithabort numeric_truncation para determinar la gravedad de un error de ese tipo. El valor predeterminado, arithabort numeric_truncation on , aborta la instrucción que origina el error, pero continúa procesando otras instrucciones de la transacción o lote. Si define arithabort numeric_truncation off , SQL Server trunca los resultados de la consulta y sigue procesando.

Errores de dominio

La función convert genera un error de dominio cuando el argumento de la función se encuentra fuera del margen sobre el que se define la función. Esto debería ocurrir con poca frecuencia. Conversiones entre tipos binary e integer

Los tipos binary y varbinary almacenan datos de tipo hexadecimal que se componen de un prefijo 0x seguido de una cadena de dígitos y letras. Estas cadenas se interpretan de forma distinta en plataformas diferentes. Por ejemplo, la cadena 0x0000100 representa 65536 en las máquinas que consideran el byte 0 como el más significativo y 256 en las máquinas que consideran el byte 0 como el menos significativo. La función convert y las conversiones implícitas

Los tipos binarios pueden convertirse a valores enteros explícitamente, con la función convert , o implícitamente. Los datos pierden el prefijo 0x y después se rellenan con ceros si son demasiado cortos para el tipo nuevo, o se truncan si son demasiado largos.

convert y las conversiones de tipos de datos implícitas evalúan los datos binarios de forma distinta en plataformas diferentes. Debido a esto, los resultados pueden variar de una plataforma a otra. Emplee la función hextoint para la conversión independiente de la plataforma de cadenas de caracteres hexadecimales a valores enteros y la función inttohex para la conversión independiente de la plataforma de valores enteros a valores hexadecimales. La función hextoint

La función hextoint se utiliza para las conversiones independientes de la plataforma de datos hexadecimales a valores enteros. hextoint acepta una cadena hexadecimal válida, con o sin un prefijo 0x, entre comillas, o el nombre de una columna de tipo de caracteres o variable.

hextoin t devuelve el entero equivalente de la cadena hexadecimal. La función siempre devuelve el mismo entero equivalente para una cadena de caracteres hexadecimal dada, independientemente de la plataforma en la que se ejecute. La función inttohex

La función inttohex se utiliza para conversiones independientes de la plataforma de valores enteros a cadenas hexadecimales. inttohex acepta cualquier expresión que dé como resultado un número entero. La función siempre devuelve el mismo equivalente hexadecimal para una expresión dada, independientemente de la plataforma en la que se ejecute. Conversión de columnas image a tipos binary

La función convert puede utilizarse para convertir una columna image a binary o varbinary . Los tipos de datos binary tienen una longitud máxima, que es de 255 bytes. Si no especifica la longitud, el valor convertido tiene una longitud predeterminada de 30 caracteres. Conversión de otros tipos de datos al tipo de bits

Los tipos numéricos exactos y aproximados pueden convertirse al tipo de bits de forma implícita. Los tipos de caracteres requieren una función convert explícita.

La expresión objeto de la conversión debe componerse sólo de dígitos, un punto decimal, un símbolo monetario y un signo de suma o resta. La presencia de otros caracteres genera errores de sintaxis.

El equivalente bit de 0 es 0. El equivalente bit de cualquier otro número es 1. Cambio del formato de visualización de las fechas

El parámetro style de convert proporciona una gran variedad de formatos de visualización de fechas al convertir datos datetime o smalldatetime a char o varchar . El argumento de número proporcionado como parámetro style determina el modo en que se muestran los datos. El año puede presentarse en dos o cuatro dígitos. Para obtener un año de 4 dígitos, incluido el siglo (yyyy), añada 100 a un valor style .

A continuación se muestra una tabla con los posibles valores de style y la variedad de formatos de fecha que puede utilizarse. Cuando utilice style con smalldatetime , los estilos que incluyen segundos o milisegundos mostrarán ceros en dichas posiciones.

Tabla 10-11: Conversión de formatos de fecha con el parámetro style

Sin siglo (yy)

Con siglo (yyy0)



Norma



Salida

-

0 o 100

Valor predeterminado

mon dd yyyy hh:mm AM (o PM)

1

101

EE.UU.

mm/dd/yy

2

2

Norma SQL

yy.mm.dd

3

103

Inglés/francés

dd/mm/yy

4

104

Alemán

dd.mm.yy

5

105

dd-mm-yy

6

106

dd mon yy

7

107

mon dd, yy

8

108

hh:mm:ss

-

9 o 109

Valor predeterminado + milisegundos

mon dd yyyy hh:mm:sss AM (o PM)

10

110

EE.UU.

mm-dd-yy

11

111

Japón

yy/mm/dd

12

112

ISO

yymmdd

Los valores predeterminados, estilo 0 o 100, y 9 o 109, siempre devuelven el siglo (yyyy).

A continuación se muestra un ejemplo del uso del parámetro style de convert :

 select convert(char(12), getdate(), 3) 

Esto convierte la fecha actual al estilo ''3'', dd/mm/yy .


Funciones de fecha [Table of Contents] Chapter 11: Creación de índices en tablas