Desvendando o SQL - Parte VIII - Conversão de Valores
Autor: Rubens Lima | Publicado: 2013-08-08T00:26:00-03:00





Amigos e leitores, estamos de
volta. Essa já é a 8ª parte da nossa série de artigo sobre a linguagem SQL.
Vamos continuar hoje mostrando como trabalhar com a conversão de valores no SQL
usando as expressões CAST e CONVERT, desejo uma boa leitura a todos.




Ao longo de nossos artigos você
deve ter notado que usamos uma expressão do tipo ...CAST(Campo AS
Varchar(10))..., o que ela faz é converter o valor de Campo para o tipo
varchar(10), assim com é possível converte para os outros vários tipos existentes.
Isso é necessário quando temos resultados que precisam se adaptar a outros,
parâmetros que chegam a um tipo diferente, dentre outras opções.



Sintaxe


Syntaxe para CAST:
CAST ( expressão AS tipo de dados [ ( tamanho ) ] )
&nbsp;
Syntaxe para CONVERT:
CONVERT ( tipo de dados [ ( tamanho ) ]&nbsp; , expressão [ , estilo ] )



Os tipos, vimos de forma geral em
nossa segunda parte (Desvendando
o SQL - Parte II). Já os estilos, veremos os mais usados.



Estilos de data e hora



Quando se tratar de data ou hora
os estilos podem ser os valores da tabela abaixo, lembrando que o SQL por
padrão considera para corte o ano de 2049, ou seja, o ano de dois dígitos 49 é
considerado o ano de 2049, já 50 é considerado como 1950.



 

  
  
Sem século (aa) (1)

  
  
Com século (aaaa)

  
  
Standard

  
  
Entrada/Saída (3)

 

  
  
-

  
  
0&nbsp;ou&nbsp;100

  
  
Padrão

  
  
mês dd aaaa hh:miAM (ou PM)

 

  
  
1

  
  
101

  
  
EUA

  
  
mm/dd/aaaa

 

  
  
2

  
  
102

  
  
ANSI

  
  
aa.mm.dd

 

  
  
3

  
  
103

  
  
Britânico/francês

  
  
dd/mm/aaaa

 

  
  
4

  
  
104

  
  
Alemão

  
  
dd.mm.aa

 

  
  
5

  
  
105

  
  
Italiano

  
  
dd-mm-aa

 

  
  
6

  
  
106

  
  
-

  
  
dd mês aa

 

  
  
7

  
  
107

  
  
-

  
  
Mês dd, aa

 

  
  
8

  
  
108

  
  
-

  
  
hh:mi:ss

 

  
  
-

  
  
9&nbsp;ou&nbsp;109

  
  
Padrão + milissegundos

  
  
mês dd aaaa hh:mi:ss:mmmAM (ou
  PM)

 

  
  
10

  
  
110

  
  
EUA

  
  
mm-dd-aa

 

  
  
11

  
  
111

  
  
JAPÃO

  
  
aa/mm/dd

 

  
  
12

  
  
112

  
  
ISO

  
  
aammdd

aaaammdd

 

  
  
-

  
  
13&nbsp;ou113

  
  
Padrão Europa + milissegundos

  
  
dd mês aaaa hh:mi:ss:mmm (24h)

 

  
  
14

  
  
114

  
  
-

  
  
hh:mi:ss:mmm(24h)

 

  
  
-

  
  
20&nbsp;ou120

  
  
ODBC canônico

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

 

  
  
-

  
  
21&nbsp;ou121

  
  
ODBC canônico (com
  milissegundos)

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

 

  
  
-

  
  
126

  
  
ISO8601

  
  
aaaa-mm-ddThh:mi:ss.mmm (sem
  espaços)

 

  
  
-

  
  
127

  
  
ISO8601 com fuso horário Z.

  
  
aaaa-mm-ddThh:mi:ss.mmmZ (sem
  espaços)

 

  
  
-

  
  
130

  
  
Islâmico (5)

  
  
dd mmm aaaa hh:mi:ss:mmmAM

 

  
  
-

  
  
131

  
  
Islâmico (5)

  
  
dd/mm/aa hh:mi:ss:mmmAM

 




Estilo float e real



 

  
  
Valor

  
  
Saída

 

  
  
0&nbsp;(padrão)

  
  
Um máximo de 6 dígitos.&nbsp;Use em notação científica,
  quando apropriado.

 

  
  
1

  
  
Sempre 8 dígitos.&nbsp;Use sempre em notação
  científica.

 

  
  
2

  
  
Sempre 16 dígitos.&nbsp;Use sempre em notação
  científica.

 

  
  
126, 128, 129

  
  
Incluídos por razões de legado
  e poderia ser preterido em uma versão futura.

 




Estilos money e smallmoney



 

  
  
Valor

  
  
Saída

 

  
  
0&nbsp;(padrão)

  
  
Nenhuma vírgula a cada três
  dígitos à esquerda do ponto decimal e dois dígitos à direita do ponto
  decimal. Por exemplo, 4235.98.

 

  
  
1

  
  
Vírgulas a cada três dígitos à
  esquerda do ponto decimal e dois dígitos à direita do ponto decimal. Por
  exemplo, 3,510.92.

 

  
  
2

  
  
Nenhuma vírgula a cada três
  dígitos à esquerda do ponto decimal e quatro dígitos à direita do ponto
  decimal. Por exemplo, 4235.9819.

 

  
  
126

  
  
Equivalente ao estilo 2 ao
  converter para char(n) ou varchar (n)

 




Estilos binários



 

  
  
Valor

  
  
Saída

 

  
  
0(padrão)

  
  
Converte caracteres ASCII em
  bytes binários ou bytes binários em caracteres ASCII.&nbsp;Cada caractere ou byte
  é convertido 1:1.

Se o&nbsp;data_type&nbsp;for um tipo binário, o
  caracteres 0x serão adicionados à esquerda do resultado.

 

  
  
1,&nbsp;2

  
  
Se o&nbsp;data_type&nbsp;for um tipo binário, a
  expressão deve ser uma expressão de caracteres.&nbsp;A&nbsp;expression&nbsp;deve ser composta por
  um número par de dígitos hexadecimais (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C,
  D, E, F, a, b, c, d, e, f).&nbsp;Se o&nbsp;style&nbsp;for definido como 1,
  os caracteres 0x devem ser os primeiros dois caracteres na expressão.&nbsp;Se a expressão
  contiver um número de caracteres ímpar ou se algum dos caracteres for
  inválido, ocorrerá um erro.

Se o comprimento da expressão
  convertida for maior que o comprimento do resultado de&nbsp;data_type&nbsp;será truncado à
  direita.

data_types&nbsp;de comprimento fixo
  que são maiores que o resultado convertido terão zeros adicionados à direita
  do resultado.

Se o data_type for tipo de
  caractere, a expressão deve ser uma expressão de binária.&nbsp;Cada caractere binário
  é convertido em dois caracteres hexadecimais.&nbsp;Se o comprimento da
  expressão convertida for maior que o comprimento de&nbsp;data_type&nbsp;será truncado à direita.

Se o&nbsp;data_type&nbsp;for um tipo de
  caractere de tamanho fixo e o comprimento do resultado convertido for menor
  que o comprimento dodata_type, espaços serão
  adicionados à direita da expressão convertida para manter um número par de
  dígitos hexadecimais.

Os caracteres 0x serão
  adicionados à esquerda do resultado convertido para&nbsp;style&nbsp;1.

 




Conversões implícitas



As conversões implícitas são
aquelas que não são preciso colocar CAST ou CONVERT, já as explicitas o uso
dessas funções é obrigatória. No gráfico abaixo mostramos as várias conversões
explicitas e implícitas fornecido pelo SQL.









Exemplos



Usando CAST e CONVERT. Cada
exemplo recupera o nome dos produtos que têm um 3 no primeiro dígito do código
de referencia e converte esse código para uma cadeia de caracteres com 10
posições.



-- Use CAST

GO

SELECT SUBSTRING(DESC_PRODUTO, 1, 30) AS Produto,
ST_PRODUTO

FROM TBProduto

WHERE CAST(CD_REFERENCIA AS varchar(10)) LIKE '3%';

GO



-- Use CONVERT.

-GO

SELECT SUBSTRING(DESC_PRODUTO, 1, 30) AS Produto,
ST_PRODUTO

FROM TBProduto

WHERE CONVERT(varchar(10), CD_REFERENCIA) LIKE '3%';

GO





Usando CAST para concatenar.



GO

SELECT 'O
produto ' + DESC_PRODUTO + ' tem valor unitário de R$
' + Cast(VLR_UNITARIO as varchar(10)) as Preco

FROM 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBEstoque e inner
join

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBProduto p on
p.cd_produto =
e.cd_produto



Usando CAST e CONVERT com dados
datetime. O exemplo a seguir exibe a data e a hora atuais, usa CAST para
alterar a data e a hora atuais em um tipo de dados de caracteres e, em seguida,
usa CONVERT para exibir a data e a hora em alguns formatos.



SELECT 

&nbsp;&nbsp; GETDATE() AS
DataNormalSemConversao,

&nbsp;&nbsp; CAST(GETDATE() AS nvarchar(30)) AS UsandoCast,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 101) AS Estilo101,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 102) AS Estilo102,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 103) AS Estilo103,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 104) AS Estilo104,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 105) AS Estilo105,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 106) AS Estilo106,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 107) AS Estilo107,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 108) AS Estilo108,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 109) AS Estilo109,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 110) AS Estilo110,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 111) AS Estilo111,

&nbsp;&nbsp; CONVERT(nvarchar(30), GETDATE(), 112) AS Estilo112

GO



Como podemos ver,
podemos converter diferentes tipos de dados em diferentes tipos de dados, a
gama é extensa, vale o seu teste, tente fazer algumas conversões, veja o que
pode e o que não pode e caso tenha dúvidas ou sugestões fique a vontade para
comentar o artigo, terei prazer em responder.



Em nosso próximo
artigo vamos falar as STORED PROCEDURES ou PROCEDIMENTOS ARMAZENADOS, e vamos
ter oportunidade de usar tudo que vimos até agora, espero você no próximo. Grande
abraço e até breve.




Artigos anteriores:

Desvendando o SQL - Parte I - Introdução
Desvendando o SQL - Parte II - Criando um Banco de Dados e Tabelas

Desvendando o SQL - Parte III - Alterando Registros


Desvendando o SQL - Parte IV - Consultas


Desvendando o SQL - Parte V - Visões

Desvendando o SQL - Parte VI - Estruturas Condicionais e de Repetição
Desvendando o SQL - Parte VII - Cursores