Subject Re: [firebird-support] select birthdays form the next several days
Author Florian Hector
>
> I don't like them both, do you have another better idea?
>

I had the same problem, especially with finding something that also works before or after new year.
I ended up using a stored procedure:

It expects the number of days before and after a given date and returns the persons name, day of
birth, month of birth, year of past or coming birthday and how old the person just turned or will turn.

Of course, you have to adapt it to fit your table and fieldnames.

CREATE PROCEDURE ZEIGEGEBURTSTAGE(
DATUM DATE,
TAGEDAVOR INTEGER,
TAGEDANACH INTEGER)
RETURNS (
PERSONENNAME VARCHAR(62),
GEBURTSTAG SMALLINT,
GEBURTSMONAT SMALLINT,
JAHR SMALLINT,
PERSALTER SMALLINT)
AS
begin
/*Wenn kein Datum mit übergeben wurde, nehmen wir das aktuelle Datum auf dem Server*/
if (:Datum IS NULL) then Datum = CURRENT_DATE;
/*Zeige den Namen der Personen und den Teil Tag und Monat aus ihren Geburtstagen */
/*Zuerst alle Geburtstage aus dem alten Jahr wenn der Zeitraum einen Jahreswechsel umfasst*/
FOR SELECT PersonenName, EXTRACT(DAY FROM PersGebDatum), EXTRACT (MONTH FROM PersGebDatum),
EXTRACT (YEAR FROM CURRENT_DATE)-1, (EXTRACT (YEAR from :DATUM) - EXTRACT (YEAR from PersGebDatum)) -1
from Tabpersonen
WHERE
Cast (EXTRACT(DAY FROM PersGebDatum)||'.'||EXTRACT(MONTH FROM PersGebDatum)||'.'||(EXTRACT(YEAR
FROM :Datum) - 1) AS DATE) BETWEEN
Cast (EXTRACT(DAY FROM :DATUM - :TAGEDAVOR)||'.'||EXTRACT(MONTH FROM :DATUM -
:TAGEDAVOR)||'.'||EXTRACT(YEAR FROM :Datum - :TAGEDAVOR) AS DATE) AND
Cast (EXTRACT(DAY FROM :DATUM + :TAGEDANACH)||'.'||EXTRACT(MONTH FROM :DATUM +
:TAGEDANACH)||'.'||EXTRACT(YEAR FROM :Datum + :TAGEDANACH) AS DATE)
ORDER BY 3, 2
INTO :PERSONENNAME, :GEBURTSTAG, :GeburtsMonat, :JAHR, :PersAlter DO
suspend;
/*Zeige den Namen der Personen und den Teil Tag und Monat aus ihren Geburtstagen */
FOR SELECT PersonenName, EXTRACT(DAY FROM PersGebDatum), EXTRACT (MONTH FROM PersGebDatum),
EXTRACT (YEAR FROM CURRENT_DATE), EXTRACT (YEAR from :DATUM) - EXTRACT (YEAR from PersGebDatum)
from Tabpersonen
WHERE
/*Dann alle Geburtstage aus dem aktuellen Jahr*/
Cast (EXTRACT(DAY FROM PersGebDatum)||'.'||EXTRACT(MONTH FROM PersGebDatum)||'.'||EXTRACT(YEAR
FROM :Datum) AS DATE) BETWEEN
Cast (EXTRACT(DAY FROM :DATUM - :TAGEDAVOR)||'.'||EXTRACT(MONTH FROM :DATUM -
:TAGEDAVOR)||'.'||EXTRACT(YEAR FROM :Datum - :TAGEDAVOR) AS DATE) AND
Cast (EXTRACT(DAY FROM :DATUM + :TAGEDANACH)||'.'||EXTRACT(MONTH FROM :DATUM +
:TAGEDANACH)||'.'||EXTRACT(YEAR FROM :Datum + :TAGEDANACH) AS DATE)
ORDER BY 3, 2
INTO :PERSONENNAME, :GEBURTSTAG, :GeburtsMonat, :JAHR, :PersAlter DO
suspend;
/*Zeige den Namen der Personen und den Teil Tag und Monat aus ihren Geburtstagen */
FOR SELECT PersonenName, EXTRACT(DAY FROM PersGebDatum), EXTRACT (MONTH FROM PersGebDatum),
EXTRACT (YEAR FROM CURRENT_DATE)+1, (EXTRACT (YEAR from :DATUM) - EXTRACT (YEAR from PersGebDatum)) + 1
from Tabpersonen
WHERE
/*Dann alle Geburtstage aus dem kommenden Jahr wenn der Zeitraum einen Jahreswechsel umfasst*/
Cast (EXTRACT(DAY FROM PersGebDatum)||'.'||EXTRACT(MONTH FROM PersGebDatum)||'.'||(EXTRACT(YEAR
FROM :Datum) + 1) AS DATE) BETWEEN
Cast (EXTRACT(DAY FROM :DATUM - :TAGEDAVOR)||'.'||EXTRACT(MONTH FROM :DATUM -
:TAGEDAVOR)||'.'||EXTRACT(YEAR FROM :Datum - :TAGEDAVOR) AS DATE) AND
Cast (EXTRACT(DAY FROM :DATUM + :TAGEDANACH)||'.'||EXTRACT(MONTH FROM :DATUM +
:TAGEDANACH)||'.'||EXTRACT(YEAR FROM :Datum + :TAGEDANACH) AS DATE)
ORDER BY 3, 2
INTO :PERSONENNAME, :GEBURTSTAG, :GeburtsMonat, :JAHR, :PersAlter DO
suspend;

end

Florian