Jubilare aus Tabelle abfragen mit Oracle?

Hallo!

ich suche nach einer Möglichkeit, Jubilare aus einer Tabelle abzufragen. Drehe aber langsam durch, weil ich zu keinem sinnvolle Ergebnis komme. Ziel ist es, in einem Zeitfenster von heute an + 15 Tage alle runden Geburtstage zu filtern. Derzeit bekomme ich vorallem für den Sprung über einen Monat hinaus ein Problem. Aber auch im Februar, mit dem ich einige Tests hinter mir habe komme ich nicht weiter. Bei + 15 klappt es anscheinend. setze ich den Wert auf 16 hoch, dann mischt sich auf einmal der Juli mit unter.

Wer kann helfen?

select geburtsdatum, to_date(to_char(geburtsdatum, ‚dd.mm.‘)||to_char(to_number(to_char(sysdate + 15, ‚YYYY‘))), ‚dd.mm.yyyy‘) as Geburtstag, to_char(to_number(to_char(sysdate, ‚YYYY‘))) - to_char(geburtsdatum, ‚yyyy‘) as Differenz, to_char(geburtsdatum, ‚dd. Month‘) as Tag from Kunde where geburtsdatum is not NULL and to_char(Geburtsdatum, ‚dd. Month‘) >= to_char(sysdate, ‚dd. Month‘) and to_char(Geburtsdatum, ‚dd. Month‘) = to_char(sysdate, ‚dd. Month‘) and to_char(Geburtsdatum, ‚dd. Month‘)

Hi!

Wer kann helfen?

Vielleicht.

select geburtsdatum, to_date(to_char(geburtsdatum,
‚dd.mm.‘)||to_char(to_number(to_char(sysdate + 15, ‚YYYY‘))),
‚dd.mm.yyyy‘) as Geburtstag,
to_char(to_number(to_char(sysdate, ‚YYYY‘))) -
to_char(geburtsdatum, ‚yyyy‘) as Differenz,
to_char(geburtsdatum, ‚dd. Month‘) as Tag from Kunde where
geburtsdatum is not NULL and to_char(Geburtsdatum, ‚dd.
Month‘) >= to_char(sysdate, ‚dd. Month‘) and
to_char(Geburtsdatum, ‚dd. Month‘)

select geburtsdatum,
to_date(to_char(geburtsdatum,‚DD.MM.‘)||
to_char(sysdate,‚YYYY‘),‚DD.MM.YYYY‘),
abs(to_number(to_char(geburtsdatum))
-to_number(to_char(sysdate)))
from kunde
where to_char(geburtsdatum,‚DDD‘) between to_char(trunc(sysdate),‚DDD‘)-15 and to_char(trunc(sysdate),‚DDD‘)+15

Probleme ergeben noch der Jahreswechsel und ev. mußt Du noch ein to_number um das to_char machen …

Und jetzt hab ich keine Zeit mehr …

Grüße,
Tomh

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

Hallo,

ich hab zwar nicht die Zeit, deinen komplexen Ausdruck zu formulieren, aber ich hoffe diese Hinweise helfen dir:

Wenn ein runder Geburtstag z.B. alle glatten 5 Jahre sind, kannst du mit diesem Statement nach diesen suchen :

SQL> select mod(to_char(sysdate,‚YYYY‘),5) from dual

MOD(TO_CHAR(SYSDATE,‚YYYY‘),5)

4

Wenn das Ergebnis ‚0‘ ist, dann war das Jahr durch 5 teilbar.

Die Zeispanne muss mit folgendem Statement zu finden sein :

SQL> select to_char (sysdate-(2+2/24), ‚DD.MON.YYYY HH24:MI‘) as Geburtstag from dual;

GEBURTSTAG

10.FEB.2009 09:18

Deine Abfrage müsste also etwa so aussehen :

…where geburtstag between sysdate AND sysdate+16 …

geburtstag muss natürlich Tag und Monat aus dem Geburtsjahr mit angehängtem aktuellem Jahr sein, also so ähnlich :

SQL> select to_date(to_char(sysdate-3600,‚DD.MM.‘)||to_char(sysdate,‚YYYY‘)) from dual;

TO_DATE(

06.04.09 Tag und Monat kommen hier aus (sysdate-3600,‚DD.MM.‘)
das Jahr kommt aus (sysdate,‚YYYY‘)

Ich hoffe, das hilft.

Gruß
Georg

Hallo zusammen!

An alle, die sich bisher bemüht haben, mir auf die Sprünge zu helfen „Vielen Dank“!!

Leider konnte ich heute noch nicht selbst an dem Thema weiter arbeiten. Mein Kollege hat sich der Sache aber auf Grundlage der hier hinterlegten Hilfen und Tipps angenommen und konnte dem gewünschten Ergebnis schon sehr nahe kommen.

Ihr habt also auf jeden Fall echt sehr gute Hilfe geleistet.

Grüße blechdesigner

Hmmm…

und konnte
dem gewünschten Ergebnis schon sehr nahe kommen.
Ihr habt also auf jeden Fall echt sehr gute Hilfe geleistet.

nicht, daß ich arrogant wirken wollte, aber mein Ergebnis hat genau die richtigen Datensätze herausgesucht. Was heißt denn „sehr nahe“, worin lag noch das Problem?

Gruß

Sancho

Sehr nahe heißt nur, dass ich noch einige Abwandlungen an meiner Abfrage vornehmen mußte. Selbstverständlich ist der Kern meines Problems genau getroffen worden :wink:

Habe mich vielleicht etwas unpassend ausgedrückt.

Aktueller Stand ist, dass ich nun alle Daten beisammen habe un in zwei getrennten Sichten (views) bereit stelle.

Ihr habt mir also sehr geholfen. Vielen Dank für die professionelle Unterstützung an Alle!!

Habe jetzt nur noch ein kleines Problem, welches ich aber gesondert recherchieren werde, da es in ideses Thema hier nicht reinpasst.

Wahrscheinlich muß ich für die Sichten noch Synonyme anlegen, damit auch andere Benutzer in der Anwendung auf die Sichten zugreifen können. Angelegt sind die Sichten unter einem Schema. Benutzer dieses Schemas können auch ohne Probleme drauf zugreifen. Ein Grant select on to public habe ich bereits abgesetzt, sodass eigentlich alles auswahlberechtigung haben sollten.

Wenn jemand noch einen Tip dazu hat, dann eventuell per direkter Email an mich.

ciao