Firebird Select com between com resultados

Firebird

28/11/2014

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

Curtidas 0

Respostas

Marisiana Battistella

Marisiana Battistella

28/11/2014

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...
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

28/11/2014

Tenta utilizar o LIKE, veja exemplos em Outras Alternativas ao Uso do Like no Interbase/Firebird
GOSTEI 0
Mauri Oliveira

Mauri Oliveira

28/11/2014

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.
GOSTEI 0
Mauri Oliveira

Mauri Oliveira

28/11/2014

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!!..
GOSTEI 0
Junior Azevedo

Junior Azevedo

28/11/2014

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')
GOSTEI 0
Mauri Oliveira

Mauri Oliveira

28/11/2014

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.
GOSTEI 0
Mauri Oliveira

Mauri Oliveira

28/11/2014

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.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

28/11/2014

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

Mauri Oliveira

28/11/2014

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!.
.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

28/11/2014

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

Mauri Oliveira

28/11/2014

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
GOSTEI 0
Rafael Mota

Rafael Mota

28/11/2014

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!!
GOSTEI 0
Mauri Oliveira

Mauri Oliveira

28/11/2014

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
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

28/11/2014

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...
GOSTEI 0
Mauri Oliveira

Mauri Oliveira

28/11/2014

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.
GOSTEI 0
Mauri Oliveira

Mauri Oliveira

28/11/2014

Postando novamente os comandos:

Este 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 like 'LICENCA%') and (d.TipoCodigo = '0001'))


Este não retorna nenhum resultado:
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'))


Veja que a diferença e somente no like.
GOSTEI 0
Mauri Oliveira

Mauri Oliveira

28/11/2014

Pessoal obrigado,

Consegui analisar o que estava ocorrendo, na presa de testar não acrescentei o left join no comando e o campo data que deveria ser testado era da outra tabela e não a data na tabela documento, por isso retornava vazio.

Desculpe-me por 'Roubar' o tempo de vocês com este erro que eu mesmo provoquei.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

28/11/2014

Sem problemas Mauri, estamos aqui para aprender!
Que bom que conseguistes solucionar o caso!
GOSTEI 0
POSTAR