Desvendando o SQL - Parte VIII - Conversão de Valores

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 ) ] )
 
Syntaxe para CONVERT:
CONVERT ( tipo de dados [ ( tamanho ) ]  , 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 ou 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 ou 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 ou113
Padrão Europa + milissegundos
dd mês aaaa hh:mi:ss:mmm (24h)
14
114
-
hh:mi:ss:mmm(24h)
-
20 ou120
ODBC canônico
aaaa-mm-dd hh:mi:ss(24h)
-
21 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 (padrão)
Um máximo de 6 dígitos. Use em notação científica, quando apropriado.
1
Sempre 8 dígitos. Use sempre em notação científica.
2
Sempre 16 dígitos. 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 (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. Cada caractere ou byte é convertido 1:1.
Se o data_type for um tipo binário, o caracteres 0x serão adicionados à esquerda do resultado.
1, 2
Se o data_type for um tipo binário, a expressão deve ser uma expressão de caracteres. A expression 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). Se o style for definido como 1, os caracteres 0x devem ser os primeiros dois caracteres na expressão. 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 data_type será truncado à direita.
data_types 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. Cada caractere binário é convertido em dois caracteres hexadecimais. Se o comprimento da expressão convertida for maior que o comprimento de data_type será truncado à direita.
Se o data_type 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 style 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
      TBEstoque e inner join
      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
   GETDATE() AS DataNormalSemConversao,
   CAST(GETDATE() AS nvarchar(30)) AS UsandoCast,
   CONVERT(nvarchar(30), GETDATE(), 101) AS Estilo101,
   CONVERT(nvarchar(30), GETDATE(), 102) AS Estilo102,
   CONVERT(nvarchar(30), GETDATE(), 103) AS Estilo103,
   CONVERT(nvarchar(30), GETDATE(), 104) AS Estilo104,
   CONVERT(nvarchar(30), GETDATE(), 105) AS Estilo105,
   CONVERT(nvarchar(30), GETDATE(), 106) AS Estilo106,
   CONVERT(nvarchar(30), GETDATE(), 107) AS Estilo107,
   CONVERT(nvarchar(30), GETDATE(), 108) AS Estilo108,
   CONVERT(nvarchar(30), GETDATE(), 109) AS Estilo109,
   CONVERT(nvarchar(30), GETDATE(), 110) AS Estilo110,
   CONVERT(nvarchar(30), GETDATE(), 111) AS Estilo111,
   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:

Comentários

Postagens mais visitadas