none
Ordenar por data no formato dd/mm/yyyy com nome da coluna RRS feed

  • Pergunta

  • Pessoal,

    Quando executo:
    SELECT CONVERT(CHAR(10),dataNascimento,103)
      FROM tbl_Assinantes
      ORDER BY dataNascimento DESC
    
    
    O resultado do select aparece ordenado corretamente, porém sem o nome da coluna:
               
    ---------- 
    30/07/2009
    30/07/2009
    30/07/2009
    28/07/2009
    28/07/2009
    24/07/2009
    23/07/2009
    22/07/2009
    21/07/2009
    20/07/2009
    17/07/2009
    16/07/2009
    15/07/2009
    Agora, se eu utilizar o 'as dataNascimento':

    SELECT CONVERT(CHAR(10),dataNascimento,103) as dataNascimento
      FROM tbl_Assinantes
      ORDER BY dataNascimento DESC
    
    O nome da coluna aparece normalmente, poré o resultado sai totalmente desordenado.

    Como corrijo isso? Onde estou comendo bola????

    Obrigado!

    • Editado Nenhum Mail quinta-feira, 30 de julho de 2009 22:34
    quinta-feira, 30 de julho de 2009 22:33

Respostas

  • Boa Noite,

    O ORDER BY é sempre processado por último e como você deu o alias "DataNascimento" à coluna, o ORDER BY irá considerar essa coluna convertida e não a coluna da tabela. Tente o seguinte:

    SELECT CONVERT(CHAR(10),dataNascimento,103) as dataNascimento
      FROM tbl_Assinantes
      ORDER BY tbl_Assinantes.dataNascimento DESC
    Nos bancos com o modo de compatibilidade 90 e superior deve funcionar. Nos bancos com modo de compatibilidade inferior essa consulta pode gerar problemas. O melhor mesmo seria que houvesse diferenciação entre a coluna e o nome do Alias. Sugestões alternativas incluem fazer a conversão na aplicação (minha melhor sugestão) ou ainda colocar as duas colunas em uma View, exibir uma coluna e ordenar por outra.

    [ ]s,
     
    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Mitos do SQL Server – Será que COUNT(1) ou COUNT('X') são mais performáticos que COUNT(*) ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!658.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Nenhum Mail sexta-feira, 31 de julho de 2009 13:38
    sexta-feira, 31 de julho de 2009 01:00

Todas as Respostas

  • Boa Noite,

    O ORDER BY é sempre processado por último e como você deu o alias "DataNascimento" à coluna, o ORDER BY irá considerar essa coluna convertida e não a coluna da tabela. Tente o seguinte:

    SELECT CONVERT(CHAR(10),dataNascimento,103) as dataNascimento
      FROM tbl_Assinantes
      ORDER BY tbl_Assinantes.dataNascimento DESC
    Nos bancos com o modo de compatibilidade 90 e superior deve funcionar. Nos bancos com modo de compatibilidade inferior essa consulta pode gerar problemas. O melhor mesmo seria que houvesse diferenciação entre a coluna e o nome do Alias. Sugestões alternativas incluem fazer a conversão na aplicação (minha melhor sugestão) ou ainda colocar as duas colunas em uma View, exibir uma coluna e ordenar por outra.

    [ ]s,
     
    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Mitos do SQL Server – Será que COUNT(1) ou COUNT('X') são mais performáticos que COUNT(*) ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!658.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Nenhum Mail sexta-feira, 31 de julho de 2009 13:38
    sexta-feira, 31 de julho de 2009 01:00
  • Boa Noite,

    O ORDER BY é sempre processado por último e como você deu o alias "DataNascimento" à coluna, o ORDER BY irá considerar essa coluna convertida e não a coluna da tabela. Tente o seguinte:

    SELECT
     CONVERT
    (CHAR
    (10),dataNascimento,103) as
     dataNascimento
    FROM tbl_Assinantes
    ORDER BY tbl_Assinantes.dataNascimento DESC
    Nos bancos com o modo de compatibilidade 90 e superior deve funcionar. Nos bancos com modo de compatibilidade inferior essa consulta pode gerar problemas. O melhor mesmo seria que houvesse diferenciação entre a coluna e o nome do Alias. Sugestões alternativas incluem fazer a conversão na aplicação (minha melhor sugestão) ou ainda colocar as duas colunas em uma View, exibir uma coluna e ordenar por outra.

    [ ]s,
     
    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Mitos do SQL Server – Será que COUNT(1) ou COUNT('X') são mais performáticos que COUNT(*) ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!658.entry


    Classifique as respostas. O seu feedback é imprescindível
    Oi, Gustavo, muito obrigado pela sogestão t-sql, mas não funfou. Deu o mesmo resultado.

    Entendi a explicação sobre a ordem de conversão e ordenação e fiz o teste trocando do alias por um nome diferente da coluna. Dessa forma funcionou perfeitamente.

    Porém, como estou aprendendo asp.net, há algumas classes (SqlDataAdapter, DataSet, DataTable) que possuem métodos automaticos para operações de INSERT, DELETE e UPDATE no Banco. Mas para funcionarem, dependem 100% dos nomes originais das colunas do banco.

    Por causa disso, me convencí mesmo de fazer esse tratamento de exibição em dd/mm/yyyy no DataGrid. Embora ainda não tenha conseguido utilizar com sucesso esses métodos automáticos do Asp.Net, já fica disponível o nome original da tabela e tenho o meu resultado na página como quero!

    Obrigado pelas dicas!
    sexta-feira, 31 de julho de 2009 13:37
  • O problema é a ordenação do campo convertido para o char que seria uma ordenação alfabética não seguindo a ordenação numérica do datetime. O Alias só está forçando a ordenar pelo campo já convertido por isso dá errado. 

    Vc terá que colocar um alias diferente do nome do campo para evitar esse problema. 
    quarta-feira, 6 de dezembro de 2017 20:17