Mahlzeit,
wie Tomh unten anmerkt:
Ich versuch’s mal aus dem Handgelenk (und nur mal das
nötigste) und dem „DDD“ (Day of Year), um mit den Monaten
nicht übers Kreuz zu kommen
Genau das ist der richtige Ansatz.
Probleme ergeben noch der Jahreswechsel und ev. mußt Du noch
ein to_number um das to_char machen …
Für den Jahreswechsel würde ich eine Fallunterscheidung machen: wenn der DayOfYear(sysdate) >= 360 ist (ich vernachlässige jetzt den Schaltjahr), dann muß man zum DayOfyear des zu vergleichenden Geburtstags 365 dazurechnen, dann kann man wunderbar damit rechnen:
select geburtsdatum,
to\_date(to\_char(geburtsdatum, 'dd.mm.')||to\_char(to\_number(to\_char(sysdate, 'YYYY'))), 'dd.mm.yyyy') as Geburtstag,
-- Alter bei sysdate berechnen
TRUNC(MONTHS\_BETWEEN(SYSDATE, geburtsdatum)/12) AS "Alter",
-- Kunde wird so alt:bei sysdate berechnen
TRUNC(MONTHS\_BETWEEN(to\_date(to\_char(geburtsdatum,
'dd.mm.')||to\_char(to\_number(to\_char(sysdate, 'YYYY'))),
'dd.mm.yyyy'), geburtsdatum)/12) AS "Wird\_alt",
-- Die Differenz berücksichtigt nicht den Jahreswechsel, Vorsicht!
to\_char(to\_number(to\_char(sysdate, 'YYYY'))) - to\_char(geburtsdatum, 'yyyy') as Differenz,
to\_char(geburtsdatum, 'dd. Month') as Tag
from Kunden
where geburtsdatum is not NULL
and (
-- Diejenigen berücksichtigen, die heute Geburtstag haben
mod(TRUNC(MONTHS\_BETWEEN(SYSDATE, geburtsdatum)/12), 10) =0
or
-- Diejenigen berücksichtigen, die in den nächsten 15 Tagen Geburtstag haben
mod (TRUNC(MONTHS\_BETWEEN(SYSDATE+15, geburtsdatum)/12),10) = 0
)
and
-- Bedingung nächste 15 Tage und heute
(
case
-- Wenn \> Mitte Dezember
when to\_number(to\_char(sysdate, 'ddd')) \> 360
then
-- Dann Januartage des nächsten Jahres berücksichtigen
to\_number(to\_char(geburtsdatum, 'ddd')) + 365
else
-- Ansonsten unveränderte Tagestzahl
to\_number(to\_char(geburtsdatum, 'ddd'))
end ) - to\_number(to\_char(sysdate, 'ddd')) Mitte Dezember
when to\_number(to\_char(sysdate, 'ddd')) \> 360
then
-- Dann Januartage des nächsten Jahres berücksichtigen
to\_number(to\_char(geburtsdatum, 'ddd')) + 365
else
-- Ansonsten unveränderte Tagestzahl
to\_number(to\_char(geburtsdatum, 'ddd'))
end );
Ich habe das Alter über Months_between ausgerechnet, weil dies den Jahreswechsel automatisch mit einbezieht. Deine Ausgabe funktioniert dann nicht.
Gruß
Sancho