Re: [firebase-br] Aniversários entre Data1 e Data2

Daniel / Tecnobyte temp em tecnobyte.com.br
Qui Fev 24 20:28:34 -03 2005


> para cada período desejado:
> PeriodoInicial = (mês inicial * 100) + dia inicial
> PeriodoFinal = (mês final * 100) + dia final
>
> where ((cast(extract(month from DataNasc) as integer) * 100) +
> cast(extract(day from DataNasc) as integer)) between :PeriodoInicial and
> :PeriodoFinal
>
> 1. De 25/02 até 05/03
> Então PeriodoInicial = 225
> Então PeriodoFinal = 305
>
> where ((cast(extract(month from DataNasc) as integer) * 100) +
> cast(extract(day from DataNasc) as integer)) between :PeriodoInicial and
> :PeriodoFinal
>
> 2. De 25/02 até 10/04
>
> where ((cast(extract(month from DataNasc) as integer) * 100) +
> cast(extract(day from DataNasc) as integer)) between 225 and 410
>
> 3. De 15/02 até 25/02
>
> where ((cast(extract(month from DataNasc) as integer) * 100) +
> cast(extract(day from DataNasc) as integer)) between 215 and 225
>
> Sds.,
> Claiton Pereira Rocha
> Desenvolvedor de Software

Funcionou perfeitamente.

Apenas adaptei algumas coisas para funcionar com períodos que envolvem mais
de um ano. Abaixo está o código Delphi com a montagem final.

var
  Dia1, Mes1, Ano1,
  Dia2, Mes2, Ano2: Word;
begin
  if Data1 <= Data2 then
  begin
    DecodeDate(Data1, Ano1, Mes1, Dia1);
    DecodeDate(Data2, Ano2, Mes2, Dia2);
  end else
  begin
    DecodeDate(Data1, Ano2, Mes2, Dia2);
    DecodeDate(Data2, Ano1, Mes1, Dia1);
  end;
  DS.Close;
  with DS.SelectSQL do
  begin
    Clear;
    Add('SELECT Nome, DataNasc, Fone, Fax, Celular, Email');
    Add('FROM Contato WHERE');
    if Abs(Ano2 - Ano1) > 1 then { O período contempla um ano inteiro. }
      Add('NOT DataNasc IS NULL')
    else
    begin
      Add('EXTRACT(MONTH FROM DataNasc) * 100 +');
      Add('EXTRACT(DAY FROM DataNasc) >= ' + IntToStr(Mes1 * 100 + Dia1));
      if Ano1 = Ano2 then
        Add('AND')
      else
        Add('OR');
      Add('EXTRACT(MONTH FROM DataNasc) * 100 +');
      Add('EXTRACT(DAY FROM DataNasc) <= ' + IntToStr(Mes2 * 100 + Dia2));
    end;
  end;
  DS.Open;

Atenciosamente.

Daniel P. Guimarães
Tecnobyte Informática
www.tecnobyte.com.br





Mais detalhes sobre a lista de discussão lista