[firebase-br] SQL Complexa ainda mais (Solução)

Eduardo Jedliczka edujed em gmail.com
Qui Jul 1 22:07:44 -03 2010


hum... acabo de perceber o que vc queria... encontrei o seu e-mail anterior:

>> 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;


Dá para fazer assim (FB 1.X e 2.X):

select * from teste T  where T.data_inicial = (select max(
X.data_inicial ) from teste X where X.data_inicial <= :data_desejada)

Abraço

Eduardo Jedliczka

Em 1 de julho de 2010 21:57, Eduardo Jedliczka <edujed em gmail.com> escreveu:
> Não sei se entendi o que voce quer, (se tiver data final, todos os
> lançamentos compreendidos naquele mês, senão, os lançamentos
> anteriores ao mês informado)
>
> Mas não seria mais fácil passar, ao invés de mês e ano, o dia e fim do
> período e fazer algo do tipo:
>
> select x.* from teste x
> where x.matricula = :matricula
> and (
>  (x.data_final is not null and x.data_inicio >= :data_inicio_mes and
> x.data_final <= :data_fiim_mes)
> or (x.data_final is null and x.data_inicio<= :data_fim_mes))
>
> mas, se não dá para alterar os parâmetros, dá para montar a
> data_inicio com algo como: CAST('01.'||:mes||'.'||:ano as date)
>
> se usar o Firebird 1.x  a data final:(numa SP)
>
> DATA_FIM_MES := DATAINICIO + 32;
> DATA_FIM_MES:= DATA_FIM_MES- extract(DAY from DATA_FIM_MES);
>
> ou
>
> (CAST('01.'||:mes||'.'||:ano as date) + 32) - extract(DAY from
> (CAST('01.'||:mes||'.'||:ano as date) + 32)
>
> Firebird 2.x é só usar a INCMonth na data inicial e subtrair 1.
>
> abraço
>
> PS: eu estou longe do FB, e estou escrevendo o select de cabeça,
> portanto talvez tenha algum erro de sintaxe.
>
> Eduardo Jedliczka
>
> Em 30 de junho de 2010 14:27, Hélio Oliveira <hpensador em gmail.com> escreveu:
>> Obrigado a todos pelas dicas sugestões...
>> Abaixo uma solução que encontrei a partir da dica do colega Alyson.
>>
>> select x.*
>> from teste x
>> where x.matricula = :matricula
>>  and (((:ano || :mes) between (extract(year from x.data_inicio) ||
>> extract(month from x.data_inicio))
>>  and (extract(year from x.data_final) || extract(month from x.data_final))
>>  and x.data_final is not null)
>>   or ((extract(year from x.data_inicio) || extract(month from
>> x.data_inicio)) <= (:ano || :mes)
>>  and x.data_final is null))
>>
>> --
>> []'s,
>>
>> Hélio Oliveira
>> Analista de Sistemas
>> Delphi Developer
>> http://hpensador.blogspot.com/
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>




Mais detalhes sobre a lista de discussão lista