[firebase-br] RES: Erro com Between
Fabio - Yahoo
frl_br em yahoo.com.br
Ter Jul 3 10:03:39 -03 2007
Bom dia Danilo,
Estive lendo o desenrolar deste seu post durante o dia de ontem e hoje como
percebi que seu problema continua resolvi dar uma atenção melhor ao seu
problema.
Não sou expert em manuseio de datas por SQL, nem muito experiente com o uso
do coalesce, mas me parece que seu problema esta justamente no uso desta
clausula.
Quando você diz: "Ele me retorna a 1º linha, ou seja: dá a informação que
hoje: 02/07/2007 está entre 20/07/2006 e 09/02/2007"
Na verdade me parece que ele não utiliza a data 02/07/2007 e sim 09/02/2007,
visto que o comando coalesce retorna a primeira expressão não null, ou seja,
o campo DATA_FINAL e não current_date, isto somente para a primeira linha.
Então neste caso sua expressão fica assim:
(09/02/2007>=20/07/2006 and 09/02/2007<=09/02/2007) Verdadeiro.
Assim a primeira linha é mostrada.
Nas outras duas o problema também é a com a clausula coalesce, pois quando
você coloca a expressão coalesce(Data_Final,current_date) <=Data_Final,
sendo no caso dos dois últimos registro o campo Data_final igual a null, até
onde eu sei o null é tratado como 0, então fica assim:
(02/07/2007>=06/02/2007 and 02/07/2007<=0) Falso
(02/07/2007>=08/03/2007 and 02/07/2007<=0) Falso
Pois, 02/07/2007 não é maior nem igual a 0
Não tenho muita certeza quando ao NULL ser igual 0, geralmente em expressões
lógicas ele é tratado assim. Mesmo assim pode considerar o NULL como não
sendo maior e nem igual, portanto falso.
Não consegui ver o propósito de seu Select, então não vou sugerir como ele
deveria ser, eu colocaria um coalesce em todos os campos Data_Final, mais
isto faria com que todos os registro sejam mostrados, não sei se é isto que
você deseja.
Espero ter ajudado.
Fabio Limeira.
-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Danilo Rogério
Enviada em: segunda-feira, 2 de julho de 2007 10:49
Para: Lista Firebase
Assunto: [firebase-br] Erro com Between
Pessoal, segue as seguintes informações
Codigo Data_Inicial Data_Final
------------------------------------
100 20/07/2006 09/02/2007
100 06/02/2007 null
100 08/03/2007 null
Vejam o select a baixo.
select A.*
from Tabela A
where (A.Codigo = 100)
and (coalesce(Data_Final,current_date) >= Data_Inicial
and coalesce(Data_Final,current_date) <=Data_Final)
o que ocorre com o resultado:
Ele me retorna a 1º linha, ou seja: dá a informação que hoje: 02/07/2007
está entre 20/07/2006 e 09/02/2007 ao inves de retornar as outras duas
linhas.
A versão do Banco: FB 2.0.0.12710
____________________________________________________________________________
________
Novo Yahoo! Cadê? - Experimente uma nova busca.
http://yahoo.com.br/oqueeuganhocomisso
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Mais detalhes sobre a lista de discussão lista