[firebase-br] SQL Complexa ainda mais
Hélio Oliveira
hpensador em gmail.com
Qua Jun 30 09:21:53 -03 2010
Bom dia Colegas!
No dia 11/05/2010 eu postei aqui no news uma SQL que estava tentando
montar para obter um valor em uma tabela conforme abaixo. Desculpem
colegas este teste ficará um pouco grande
Tenho uma tabela "TESTE" com os seguintes campos:
matricula integer,
data_inicio date,
data_final date,
valor numeric(14,2)
A mesma esta populada com os seguinte valores
matricula data_inicio data_final valor
10 02/01/2009 30/06/2009 500,00
10 01/07/2009 30/11/2009 650,00
10 01/12/2009 <null> 800,00
O que preciso:
Se o mês informado estiver compreendido entre 1/2009 e 6/2009 o valor
retornado seja 500,00;
Se o mês informado estiver compreendido entre 7/2009 e 11/2009 o valor
retornado seja 650,00;
Se o mês informado for 12/2009 ou maior o valor retornado seja 800,00;
Com a ajuda do colega J. Vinicius chegamos a seguinte SQL que nesta base
funcionou.
select x.*
from teste x
where x.matricula = :matricula
and (( :mes between extract(month from X.data_inicio) and
extract(month from X.data_final))
and ( extract(year from X.data_inicio)=:ano ) and X.data_final is not
null )
or (( :mes >= extract(month from X.data_inicio) )
and ( extract(year from X.data_inicio)=:ano ) and X.data_final is null )
or (( extract(year from X.data_inicio)<:ano ) and X.data_final is null)
Mais agora em uma base real a referida não funciona... abaixa a tabela
atual com os dados.
Cod_cargo Matricula Data_inicio Data_final Salario
5 1 01/01/2009 31/05/2010 465,00
5 1 01/06/2010 <null> 510,00
Vejam, aplicando a SQL acima nesta tabela para os meses de 1 até 5/2009
é retornado o valor correto 465,00, porém se passamos o mês 6/2009 é
retornado null - sendo que deveria retornar 510,00.
--
[]'s,
Hélio Oliveira
Analista de Sistemas
Delphi Developer
http://hpensador.blogspot.com/
Mais detalhes sobre a lista de discussão lista