none
Filtro com diferentes resultados

    Pergunta

  • Boa tarde.

    Estou com um problema estranho, pelo menos para mim.

    É o seguinte, estou com uma consulta SQL que me retorna valores diferentes com filtros aparentemente iguais, conforme apresentado abaixo:

    Instrução 1 - Filtro por Data

    select * from tabela where data>='2018/04/01' and data<='2018/04/30'

    Esta consulta me retorna 337 registros

    Instrução 2 - Filtro Ano/Mes

    select * from tabela where year(data)=2018 and month(data)=4

    Esta consulta me retorna 352 registros

    Já conferi a tabela de não encontrei nada que justificasse tal diferença, ainda mais que não há nenhuma associação que pudesse justificar o efeito. E só acontece neste mês. Demorei 3 dias para detectar estar anormalidade. A tabela em questão guarda registros de movimentação de caixa e comecei a detectar o problema na virada do mês, pois, quando o sistema ia apresentar o saldo inicial para o mês corrente, percebi que o Saldo era diferente do Saldo Final do mês anterior, exatamente pela falta/inclusão dos 15 registros. Na exibição dos Lançamentos do mês 4 feito pela primeira instrução, não aparecem os 15 registros e na captura do saldo Anterior, que não especifica o mês 4, os 15 registros são incluídos, modificando o saldo apresentado.

    Alguém consegue me dar uma explicação sobre o fato? Fui claro com o problema?

    Obrigado.


    José Acílio

    terça-feira, 15 de maio de 2018 17:45

Respostas

  • Boa tarde,

    Essa coluna Data armazena somente a data mesmo ou data e hora?

    Pode ser que a parte das horas esteja provocando esse problema se essa coluna armazena data e hora. Nesse caso você poderia fazer um teste dessa forma:

    select * from tabela where data>='2018/04/01' and data<'2018/05/01'

    Espero que seja útil


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 15 de maio de 2018 17:50

Todas as Respostas

  • Boa tarde,

    Essa coluna Data armazena somente a data mesmo ou data e hora?

    Pode ser que a parte das horas esteja provocando esse problema se essa coluna armazena data e hora. Nesse caso você poderia fazer um teste dessa forma:

    select * from tabela where data>='2018/04/01' and data<'2018/05/01'

    Espero que seja útil


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 15 de maio de 2018 17:50
  • Boa tarde.

    Esta coluna armazena Data e hora, mas olhando para as horas não tem nenhuma hora, nestes 15 registros que a meu ver pudesse fazer diferença. Os horários estão entre 15:00 e 21:30.

    Fiz o teste aqui, e funcionou... Mas por que só ocorre com este mês e não com os outros meses? Essa é uma questão que me intriga.

    Obrigado pela ajuda.


    José Acílio

    terça-feira, 15 de maio de 2018 18:10
  • Nesse caso qualquer fração de segundo pode provocar essa diferença, seja qual mês for. Você pode por exemplo fazer um teste inserindo uma linha com a data igual a 31/03/2018 00:00:00:003 (ou dependendo do tipo de dados 31/03/2018 00:00:01 ou 31/03/2018 00:01).

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 15 de maio de 2018 18:22
  • Eu entendi o que você havia dito, por isso, informei o intervalo dos horários presentes no campo data, pois, poderia representar um horário após a meia noite. Mas acho que não foi o caso.

    Obrigado.


    José Acílio

    terça-feira, 15 de maio de 2018 18:39
  • Esta coluna armazena Data e hora, mas olhando para as horas não tem nenhuma hora, nestes 15 registros que a meu ver pudesse fazer diferença. Os horários estão entre 15:00 e 21:30.

    Observe que
           and data<='2018/04/30'
    é tratado internamente como
           and data<='2018/04/30 00:00:00.000'

    Ou seja, qualquer linha cuja coluna data contenha o dia 30/4/2018 e que o horário seja posterior a 0:00:00.000 não será contabilizado.

    Além da sugestão do "gapimex", eis outra opção:

    -- código #1
    select * 
      from tabela 
      where cast(data as date) between '2018/04/01' and '2018/04/30';
    
    Observe que usar cast(... as date) garante que a cláusula WHERE continua sargable.


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    terça-feira, 15 de maio de 2018 18:58
    Moderador
  • O '2018/04/30' do seu filtro original é equivalente a '2018/04/30 00:00:00:000', por isso qualquer horário nesse dia provoca essa diferença.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 15 de maio de 2018 18:59
  • Boa tarde, José Diz.

    Tentei usar a sua sugestão só que me apresentou erro:

    Msg 243, Level 16, State 1, Line 2
    Type date is not a defined system type.

    O Bando em questão é o SQL Server 2005. O Erro tem a ver com o banco?

    Obrigado.


    José Acílio

    terça-feira, 15 de maio de 2018 20:33
  • Tentei usar a sua sugestão só que me apresentou erro:
    Msg 243, Level 16, State 1, Line 2
    Type date is not a defined system type.

    Isso mesmo: na versão 2005 não estava disponível o tipo de dados date.

    Nesse caso, a forma mais simples me parece ser a que o "gapimex" sugeriu, que também é sargable.


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    terça-feira, 15 de maio de 2018 22:13
    Moderador
  • Tentei usar a sua sugestão só que me apresentou erro:

    Msg 243, Level 16, State 1, Line 2
    Type date is not a defined system type.

    Isso mesmo: na versão 2005 não estava disponível o tipo de dados date.

    Nesse caso, a forma mais simples me parece ser a que o "gapimex" sugeriu, que também é sargable.


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    Amigos,

    O Datatype Date foi adicionado como novo tipo de dados a partir da versão 2008.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 16 de maio de 2018 12:34
  • Obrigado a todos pela atenção dispensada.


    José Acílio

    quarta-feira, 16 de maio de 2018 12:54