[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