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 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' 

A solução é interessante :)

E você? Tem um palpite do porque?

  1. 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’

  2. Marcos Vinicius says:

    Porque o Right? Ou aposto no no armazenamento do dado no datatype, vou testar mais!

  3. Joana Duarte says:

    a questão nao é o char ou varchar, mas sim o right.

  4. eduardo says:

    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.

  5. Na minha opinião é o seguinte…
    Variaveis do tipo CHAR(n) recebem sempre o numero exato de caracteres do (n) e devem ser utilizadas sempre que voce tem certeza do numero de caracteres que serão inseridos nesta variavel, portanto a informação ’5′ fica como ’5 ‘.
    “Use char when the sizes of the column data entries are consistent.”<– BooksOnline

    Enquanto o VARCHAR(n) deve ser utilizado sempre que a quantidade de caracteres do (n) for desconhecida, tendo o (n) como tamanho maximo somente, com isso o SQL ajusta o tamanho da variavel sempre deixando a informação '5' como '5' mesmo.
    Use varchar when the sizes of the column data entries vary considerably. <– Books Online

    Se voce alterar o Valor do RIGHT para 3 vai ter como resultado '05 ' na variavel CHAR
    SELECT RIGHT('0' + CONVERT( CHAR(2), DATEPART(mi, @data)), 3) [CHAR]

  1. There are no trackbacks for this post yet.

Leave a Reply