GARANTIR DESCONTO

Fórum Firebird Select com between com resultados #502751

28/11/2014

0

Pessoal,
Toa batendo cabeça tentando entender porque esses dois comandos abaixo um traz resultados e o outros não retorna nenhuma valor:

[code]
[/code]Estre primeiro retorna o resultado esperado
Select * from DOCUMENTO d
WHERE ( d.DATADOCUMENTO Between cast('20.11.2014' as date) And cast('21.11.2014' as date) ) AND
(d.Historico starting with 'LICENCA') and (d.TipoCodigo = '0001')

Este outro onde so foi acrescentado valores na string, resulta em nenhum registro selecionado

Select * from DOCUMENTO d
WHERE ( d.DATADOCUMENTO Between cast('20.11.2014' as date) And cast('21.11.2014' as date) ) AND
(d.Historico starting with 'LICENCA ME') and (d.TipoCodigo = '0001')

Alguem tem alguma ideia o porque ??? já bati cabeça e não consigo resolver

Banco de dados : Firebird 2.53.
OS Win 7.

Estpu usando Ibexpert e o IbConsole, o resultado e o mesmo nos dois.

Mauri Lima
Boa Vista Roraima
Mauri Oliveira

Mauri Oliveira

Responder

Posts

28/11/2014

Marisiana Battistella

Olá!
A causa não seria porque há um espaço em branco em 'LICENCA ME'?
Não conheço essa função do firebird, então foi a primeira hipótese q veio em mente quando li a pergunta...
Responder

Gostei + 0

28/11/2014

Marisiana Battistella

Tenta utilizar o LIKE, veja exemplos em Outras Alternativas ao Uso do Like no Interbase/Firebird
Responder

Gostei + 0

28/11/2014

Mauri Oliveira

Oi,

Não, o correto seria Licença Medica, se retirar o between, funciona retornando reultado normal, mesmo usando a string composta, ou parte da string, mas com o copmando between tudo fica confuso e não funciona.
Responder

Gostei + 0

28/11/2014

Mauri Oliveira

Já usei Like, containing, etc... tudo funciona mas sem o usar o between. Se usar between so reorna resultado se for usado somente uma palavra na string.
E confuso mesmo.. isso e coisa pra ninja!!..
Responder

Gostei + 0

28/11/2014

Junior Azevedo

Tente assim:
Select * from DOCUMENTO d
WHERE ( d.DATADOCUMENTO Between cast('20.11.2014' as date) And cast('21.11.2014' as date) ) AND
(d.Historico like '%LICENCA ME') and (d.TipoCodigo = '0001')
Responder

Gostei + 0

28/11/2014

Mauri Oliveira

ola,

Já tentei assim também, o resultado e o mesmo do starting with, se usar somente a primeira palavra funciona, mas se acrescentar qualquer outra passa a não retornar resultado.
exemplo se somente (Licenca) fica ok mas se usar (Licenca Me) não retorna resultado.
Responder

Gostei + 0

28/11/2014

Mauri Oliveira

Boa Tarde,

Fiz um teste com a mesma linha de comando no Postgres e não deu erro algum, retornou o resultado ok, ao que parece que é um bug no Firebird.2.5.3.
Responder

Gostei + 0

28/11/2014

Marisiana Battistella

Se executar assim
d.Historico like '%LICENCA ME%'
também ocorre erro?
Qual é o erro que o firebird apresenta?
Responder

Gostei + 0

28/11/2014

Mauri Oliveira

Olha Marisiana,

testei de todas as formas e variações com like, e também com starting with(firebird) equivale a like(string%), com containing(firebird) equivale a like (%string%), e retorna sempre vazio, e o firebird não retorna nenhum erro.
No postgresSql definir uma tabela igual ao do firebird com os mesmo dados, executei o mesmo comando usando o, like e o mesmo funcionou de forma correta, a única diferença foi devido ao collate ptbr( firebird ) que traz tanto ç como c.

De qualquer forma agradeço sua presteza em ajudar. Obrigado!.
.
Responder

Gostei + 0

29/11/2014

Marisiana Battistella

Por nada!
Eu continuo achando que tem a ver com o espaço em branco que há na string utilizada para a pesquisa...
Responder

Gostei + 0

29/11/2014

Mauri Oliveira

Já testei so com o espaço em branco e funciona mas se acrescentar uma letra após o espaço deixa de funcionar, este mesmo comando sql no postgres funciona com o espaço e mais a letra, acho que o erro e do firebird e não do comando sql, pois se o erro fosse do sql não funcionaria também no postgres.
No firebird se remover o between funciona normal.
Já tentei unsando
Select * from DOCUMENTO d
WHERE ( d.DATADOCUMENTO >= cast('20.11.2014' as date) And d.DATADOCUMENTO <=cast('21.11.2014' as date) ) AND
((d.Historico like 'LICENCA me%') and (d.TipoCodigo = '0001'))
O erro persiste, se tirar as comparação da data funciona.
E muito estranho, acho que vou te que usar um sub-select para resolver
Responder

Gostei + 0

29/11/2014

Rafael Mota

Acredito que não traz nenhum resultado porque ele não está obedecendo alguma das claúsulas.
Por exemplo, já verificou se LICENCA ME também tem o TipoCodigo 0001 ou se realmente existe um LICENCA ME no período informado?
Tenho certeza que não é o espaço em branco e acho que não é a versão do Firebird.

Boa Sorte!!
Responder

Gostei + 0

29/11/2014

Mauri Oliveira

Sim , se executar o comando sem o Between o mesmo retorna os resultados ou sem a comparação das datas, retorna os as linhas com 'LICENCA MEDICA' e 'LICENÇA MEDICA' com o tipo "0001' e se eu usar apenas o between entre as datas fornecidas também retorna linhas validas, o comando like com APENAs 'LICENCA%' mais o comando between retorna corretamente também só ue com mais valores pois ai são incluídas 'LICENÇA GESTANTE' e 'LICENCA GESTANTE'.

O 'pseudo' erro ocorre apenas se na string do like for adicionada o espaço e qualquer letra
Responder

Gostei + 0

29/11/2014

Marisiana Battistella

Se fosse algum erro na sintaxe da instrução o firebird retornaria o erro.
A questão deve ser no dados, conforme o que o Mota descreveu...
Responder

Gostei + 0

29/11/2014

Mauri Oliveira

Se você avaliar os comandos eles são exatamente iguais, a única diferença e o acréscimo de ' M', veja no like a diferença : LIKE('LICENCA%') este Retorna resultado, mas LIKE('LICENCA M%') não retorna resultado. Portanto 'algo' no firebird estar 'interpretando' errado o like, se este mesmo comando for usado no postgresSql na mesma tabela com os mesmos dados a mesma funciona corretamente tanto para o LIKE('LICENCA%') como para o LIKE(LICENCA ME%"), ai deduzo eu que o problema ocorre apenas no firebird.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar