Desafio T-SQL – CHAR X VARCHAR
Hoje a tarde meu amigo Adilson Pereira me mandou um desafio bem interessante, vou postar aqui exatamente do modo como ele propôs:
Observem a diferença que dá no resultado de um comando usando o CHAR e o VARCHAR:
declare @data datetimeset @data = ’20100310 05:05:05′SELECTRIGHT(’0′ + CONVERT( CHAR(2), DATEPART(mi, @data)), 2) as ‘CHAR’,RIGHT(’0′ + CONVERT(VARCHAR(2), DATEPART(mi, @data)), 2) as ‘VARCHAR’
A solução é interessante :)
E você? Tem um palpite do porque?
Utilizando o left o resultado é o mesmo ’05′ para char e varchar.
LEFT de 0 + char(2): ele “converte” o char(2) para char(1) e retorna o 5 como o segundo caracter a partir da esquerda ???
RIGTH de 0 + char(2): ele não “converte” o char(2) para char(1) e só retorna o 5 como se fossem 2 caracteres a partir da direita??
Algo parecido? To curioso…
declare @data datetime
set @data = ’20100310 05:05:05′
SELECT
RIGHT(’0′ + CONVERT( CHAR(2), DATEPART(mi, @data)), 2) as ‘CHAR’,
RIGHT(’0′ + CONVERT(VARCHAR(2), DATEPART(mi, @data)), 2) as ‘VARCHAR’,
LEFT(’0′ + CONVERT( CHAR(2), DATEPART(mi, @data)), 2) as ‘CHAR’,
LEFT(’0′ + CONVERT(VARCHAR(2), DATEPART(mi, @data)), 2) as ‘VARCHAR’
Porque o Right? Ou aposto no no armazenamento do dado no datatype, vou testar mais!
a questão nao é o char ou varchar, mas sim o right.
Vamos lá: a expressão varchar antes do RIGHT seria ’5′ e a char ’5 ‘, concatenando ’0′ ficariam ’05′ e ’05 ‘. Utilizando RIGHT de duas posições, então o varchar retorna ’05′ e char ’5 ‘. Para o retorno correto principalmente para minuto com apenas 1 dígito é ideal usar o tipo VARCHAR por suprimir espaços em brancos, já que estamos querendo obter sempre 2 posições.