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