none
Query traz resultado errado RRS feed

  • Pergunta

  • Fiz uma query com apenas um mes de intervalo, funcionou, mas quendo eu passo um ano de intervalo não funciona, vem tudo que está no banco. A query está em baixo:

    select

    operador

    ,convert(char,data_edicao,103)data_edicao,

     

     

    convert(char,data,103)data,nome_final,num_edicao

    from

    log_index_img

    where

     

    convert(char,data_edicao,103) between '01/01/1880' and '31/12/1880' // Não respeita esse filtro

    order

    by

    data_edicao

     

    Porem se eu passar de 01/01/1880 a 31/01/1880, aí funciona, ou seja só vem os de 1880. Se eu colocar como acima, vem todos os anos, não só os de 1880. Como fazer?

    quarta-feira, 30 de março de 2011 13:43

Respostas

  • Eu resolvi passando toda a data com a parte Hora toda zerada e no formato 'dd/mm/yyyy 00:00:00.000', aí funcionou.

    select

    operador

    ,data_edicao,

    data

    ,nome_final,num_edicao

    from

    log_index_img

    where

    data_edicao

    between '01/01/1880 00:00:00.000' and '31/12/1880 00:00:00.000'

    order

    by

    data_edicao

    • Marcado como Resposta Eder Costa sexta-feira, 1 de abril de 2011 18:32
    quarta-feira, 30 de março de 2011 14:29

Todas as Respostas

  • Bom dia pnet,

    Favor testar dessa maneira:

    set dateformat dmy
    select
    	operador,
    	convert(char,data_edicao,103)data_edicao, 
    	convert(char,data,103) data,
    	nome_final,
    	num_edicao
    from log_index_img
    where 
    	convert(datetime,data_edicao,103) between '01/01/1880' and '31/12/1880'
    order by
    	data_edicao
    
    att.
    Rafael Melo

     


    quarta-feira, 30 de março de 2011 14:00
  • Realmente pnet....tome cuidado com o convert utilizando char, pois eh diferente de usar varchar OK

    O tipo do campo DATA_EDICAO nao eh DATETIME na tabela?? e por isso que esta convertendo ?


    Thread foi útil ? Então vote !!
    ------------------------------------------------------------
    Maxwell Chaves
    MCTS - SQL Server 2008
    maxwellchaves.wordpress.com.br
    quarta-feira, 30 de março de 2011 14:05
  • Bom Dia,

    O resultado não está errado. Pelo contrário ele está muito certo. O que está errado é a interpretação do resultado já que possivelmente a formulação da consulta não reflete a necessidade que você pretende atender com ela.

    Quando você converte uma data em texto, as comparações passam a ser textuais e isso pode modificar o resultado esperado. Sobre uma perspectiva de datas, é muito claro pra nós que 01/01/2011 é maior que 31/12/2010. Agora se convertermos essas datas para texto, o texto "31/12/2010" é maior que o texto "01/01/2011", pois, o caractér "3" é superior ao caractér "1" independente do que vem após esses caractéres.

    Quando você coloca a condição '01/01/1880' and '31/12/1880' esteja certo de que você irá trazer praticamente todas as datas, pois, os caractéres "31" são maiores que todos os outros dias "01", "20", "27", etc. Somente as datas "31/12/1889" e as demais "31/12" não são retornadas, pois, a string "31/12/1889" é maior que a string "31/12/1880".

    Essa é mais uma razão para nunca em hipótese nenhuma independente das circunstâncias utilizar CONVERT para datas em cláusula WHERE. Além de deixar a consulta mais lenta, você ainda lida com resultados não esperados. Se você precisa de um ano de intervalo, use a seguinte construção:

    WHERE Data >= '20100101' And Data < '20110101' -- Para o ano de 2010 (Não coloque hífens)
    

    É a forma mais segura e eficiente de se fazer essa consulta. Confiar em opções com SET DATEFORMAT, Default Language, CONVERT para DATETIME não irão trazer os problemas do CONVERT para CHAR, mas ainda assim tem penalidades de desempenho (SET DATEFORMAT provoca recompilação nas SPs, Default Language lhe deixa dependente de configurações, e CONVERT pode incorrer em desempenho)

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 30 de março de 2011 14:25
  • Eu resolvi passando toda a data com a parte Hora toda zerada e no formato 'dd/mm/yyyy 00:00:00.000', aí funcionou.

    select

    operador

    ,data_edicao,

    data

    ,nome_final,num_edicao

    from

    log_index_img

    where

    data_edicao

    between '01/01/1880 00:00:00.000' and '31/12/1880 00:00:00.000'

    order

    by

    data_edicao

    • Marcado como Resposta Eder Costa sexta-feira, 1 de abril de 2011 18:32
    quarta-feira, 30 de março de 2011 14:29
  • pnet...

    Acredito que o motivo de ter funcionado, é pq vc retirou o convert/char e não por ter acrescentado a hora zerada.

    att.
    Rafael Melo

    quarta-feira, 30 de março de 2011 16:48