Problema com consulta SQL no Delphi e Banco de dados
Então, estou com um problema no retorno de uma consulta em SQL. Eu achava que era no Delphi, mas rodei direto no Mysql e deu o mesmo erro. Vamos lá...
select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Paga' or situacao = 'Cancelada'
select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Aberta' or situacao = 'Cancelada'
Estas linhas acima retornam corretamente o resultado da consulta.
Agora se eu coloco: select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Paga' or situacao = 'Aberta', é retornado todos os registro da tabela e se eu "inverter" o Aberta e o Paga ficando assim: select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Aberta' or situacao = Paga' o resultado da consulta retorna corretamente. Calma tem mais!
Colocando dessa forma: select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Aberta' or situacao = Paga' ele passa a retornar corretamente, mas se eu mudar o critério de pesquisa de data_cadastro para data_vencimento ou data_pagamento aí novamente passa a retornar todos os registros.
O que pode esta acontecendo?
select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Paga' or situacao = 'Cancelada'
select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Aberta' or situacao = 'Cancelada'
Estas linhas acima retornam corretamente o resultado da consulta.
Agora se eu coloco: select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Paga' or situacao = 'Aberta', é retornado todos os registro da tabela e se eu "inverter" o Aberta e o Paga ficando assim: select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Aberta' or situacao = Paga' o resultado da consulta retorna corretamente. Calma tem mais!
Colocando dessa forma: select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and situacao = 'Aberta' or situacao = Paga' ele passa a retornar corretamente, mas se eu mudar o critério de pesquisa de data_cadastro para data_vencimento ou data_pagamento aí novamente passa a retornar todos os registros.
O que pode esta acontecendo?
Pedro
Curtidas 0
Respostas
Rafael Cunha
21/09/2014
Bom Dia!
Tente realizar a consulta conforme exemplo abaixo:
Tente realizar a consulta conforme exemplo abaixo:
select * from contaspagar where (data_cadastro between '2014-09-01' and '2014-09-15') and (situacao in ('Paga', 'Aberta'))GOSTEI 0
Pedro
21/09/2014
Bom Dia!
Tente realizar a consulta conforme exemplo abaixo:
Tente realizar a consulta conforme exemplo abaixo:
select * from contaspagar where (data_cadastro between '2014-09-01' and '2014-09-15') and (situacao in ('Paga', 'Aberta'))Amigo Rafael, muito obrigado mesmo! Essa forma como você passou funcionou certinho direto no mysql, vou passar para o Delphi e passar as datas como parâmetro, creio que não vai dar problemas.
Agora qual a diferença dessa forma que você passou para a que eu costumo fazer? Não deveria funcionar igual?
GOSTEI 0
Rafael Cunha
21/09/2014
O seu hora funcionada hora não devido a forma que estava escrito seu where, pois se a primeira operação de comparação com a situação fosse falsa fazia registro seria falso por não existir parâmetros para delimitar que a situação poderia ser 'Paga' ou 'Cancelada'.
select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and (situacao = 'Paga' or situacao = 'Cancelada')
GOSTEI 0
Pedro
21/09/2014
Então Rafael, antes de ler seu post eu já havia feito isso que vc acabou de citar select * from contaspagar where data_cadastro >= '2014-09-01' and data_cadastro <= '2014-09-15' and (situacao = 'Paga' or situacao = 'Cancelada').
Deu certo, mas não sabia a explicação. Agora que vc esclareceu eu entendi.
Mais uma vez muito obrigado.
Deu certo, mas não sabia a explicação. Agora que vc esclareceu eu entendi.
Mais uma vez muito obrigado.
GOSTEI 0