none
Consulta de data no sql server RRS feed

  • Pergunta

  • Olá pessoal, eu tenho a consulta abaixo, porém o problema está na data, ela não obedece a cláusula WHERE informada, é como se ela na existisse e traz todos os valores... onde está o erro?

    desde já agradeço a ajuda...

    SELECT * 
    FROM calculo_comissao_servicos a 
    INNER JOIN funcionarios b ON a.id_funcionario = b.id_funcionario 
    INNER JOIN servicos c ON a.id_servico = c.id_servico 
    WHERE 1=1 AND CONVERT(nvarchar,a.data_cadastro,103) >= '01/09/2011' AND
    CONVERT(nvarchar,a.data_cadastro,103) <= '30/09/2011'



    João Batista :: MSN jbdiacompleto@hotmail.com :: http://www.hostmundo.com.br/hospedagem.php
    segunda-feira, 17 de outubro de 2011 02:24

Respostas

  • João

    você esta comparando texto com texto pois esta convertendo para texto a da data..

    desta maneira funciona.. talvez não seja a mais performática

    SELECT * 
    FROM calculo_comissao_servicos a 
    INNER JOIN funcionarios b ON a.id_funcionario = b.id_funcionario 
    INNER JOIN servicos c ON a.id_servico = c.id_servico 
    WHERE 1=1 AND CONVERT(datetime,a.data_cadastro,103) >= CONVERT(datetime,'01/09/2011',103) AND
    CONVERT(datetime,a.data_cadastro,103) <= CONVERT(datetime,'30/09/2011',103)
    

    Você pode tentar fazer a consulta desta maneira (sem os converts)

    SELECT * 
    FROM calculo_comissao_servicos a 
    INNER JOIN funcionarios b ON a.id_funcionario = b.id_funcionario 
    INNER JOIN servicos c ON a.id_servico = c.id_servico 
    WHERE 1=1 AND a.data_cadastro between '20110901' AND '20110930'
    

     


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 17 de outubro de 2011 12:44
    • Marcado como Resposta Eder Costa quinta-feira, 27 de outubro de 2011 15:54
    segunda-feira, 17 de outubro de 2011 10:16
    Moderador
  • Bom Dia,

    Na verdade ela obedece sim. O problema é que o código está introduzindo um BUG.
    No momento em que você converteu para VARCHAR, a comparação é com base em VARCHAR.

    Do texto 01/09/2011 até 30/09/2011, estão inclusos 02/05/1001, 06/09/2012, 11/90/2030, etc. Todos os textos que começam com 01 até 30 estão inclusos e isso significa todas as datas do seu cadastro (a exceção do dia 31). A conversão de colunas na cláusula WHERE não é perfomático e nesse caso mais que isso, retorna o resultado indesejado. Sugiro não utilizar o CONVERT (com o exemplo do Marcelo).

    Adicionalmente, recomendo o link abaixo:

    DATEDIFF, CONVERT, SUBSTRING e funções sobre colunas na cláusula WHERE e JOINs
    http://gustavomaiaaguiar.wordpress.com/2011/07/03/datediff-convert-substring-e-funes-sobre-colunas-na-clusula-where-e-joins/

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 17 de outubro de 2011 12:44
    • Marcado como Resposta Eder Costa quinta-feira, 27 de outubro de 2011 15:54
    segunda-feira, 17 de outubro de 2011 12:44

Todas as Respostas

  • João

    você esta comparando texto com texto pois esta convertendo para texto a da data..

    desta maneira funciona.. talvez não seja a mais performática

    SELECT * 
    FROM calculo_comissao_servicos a 
    INNER JOIN funcionarios b ON a.id_funcionario = b.id_funcionario 
    INNER JOIN servicos c ON a.id_servico = c.id_servico 
    WHERE 1=1 AND CONVERT(datetime,a.data_cadastro,103) >= CONVERT(datetime,'01/09/2011',103) AND
    CONVERT(datetime,a.data_cadastro,103) <= CONVERT(datetime,'30/09/2011',103)
    

    Você pode tentar fazer a consulta desta maneira (sem os converts)

    SELECT * 
    FROM calculo_comissao_servicos a 
    INNER JOIN funcionarios b ON a.id_funcionario = b.id_funcionario 
    INNER JOIN servicos c ON a.id_servico = c.id_servico 
    WHERE 1=1 AND a.data_cadastro between '20110901' AND '20110930'
    

     


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 17 de outubro de 2011 12:44
    • Marcado como Resposta Eder Costa quinta-feira, 27 de outubro de 2011 15:54
    segunda-feira, 17 de outubro de 2011 10:16
    Moderador
  • Bom Dia,

    Na verdade ela obedece sim. O problema é que o código está introduzindo um BUG.
    No momento em que você converteu para VARCHAR, a comparação é com base em VARCHAR.

    Do texto 01/09/2011 até 30/09/2011, estão inclusos 02/05/1001, 06/09/2012, 11/90/2030, etc. Todos os textos que começam com 01 até 30 estão inclusos e isso significa todas as datas do seu cadastro (a exceção do dia 31). A conversão de colunas na cláusula WHERE não é perfomático e nesse caso mais que isso, retorna o resultado indesejado. Sugiro não utilizar o CONVERT (com o exemplo do Marcelo).

    Adicionalmente, recomendo o link abaixo:

    DATEDIFF, CONVERT, SUBSTRING e funções sobre colunas na cláusula WHERE e JOINs
    http://gustavomaiaaguiar.wordpress.com/2011/07/03/datediff-convert-substring-e-funes-sobre-colunas-na-clusula-where-e-joins/

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 17 de outubro de 2011 12:44
    • Marcado como Resposta Eder Costa quinta-feira, 27 de outubro de 2011 15:54
    segunda-feira, 17 de outubro de 2011 12:44
  • Então pessoal, mas no meu banco as datas estão com data e hora no seguinte formato:
    DD/MM/YYYY HH:MM:SS

    E na minha busca eu envio somente a data, logo eu vou precisar converter o coluna do banco certo?, dai vem o problema:

    Tento de três maneiras:
    1 -
    WHERE 1=1 AND CONVERT(nvarchar,a.data_cadastro,103) >= '01/09/2011'
    2 -
    WHERE 1=1 AND CONVERT(datetime,a.data_cadastro,103) >= Convert.ToDateTime('01/09/2011')
    3 -
    WHERE 1=1 AND a.data_cadastro >= '01/09/2011'

    Em nenhuma das situações acima traz resultados. 

    desde já agradeço pela ajuda.... 

    João Batista :: MSN jbdiacompleto@hotmail.com :: http://www.hostmundo.com.br/hospedagem.php
    quarta-feira, 2 de novembro de 2011 14:44
  • Se você estiver utilizando sql server 2005 para cima use convert(date, data_cadastro) que isso faz com que o sql desconsidere o tempo da data também. (Acho que no fundo você está convertendo a data para string por causa do tempo não é?

    Enfim, usando o convert(date, Data_cadastro), o sql server continua realizando comparações entre datas e a perfomance não caí. Você apenas terá um overhead devido a conversão.


    Concatenado
    segunda-feira, 7 de novembro de 2011 10:06