Mehr von Jürgen Gutsch

Mehr von Jürgen Gutsch

Empfehlungen von Jürgen Gutsch

Blog-Empfehlungen von Jürgen Gutsch

Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Jürgen Gutsch

ASP.NET und mehr...

News

Die nächsten fünf Geburtstage mit Access SQL berechnen

für eine kleine Communityanwendung die ich, zum 10 Jährigen Klassentreffen meiner alten Schulklasse und für meine alte Schulklasse, geschrieben habe, benötigte ich eine Funktion zum anzeigen der nächsten fünf Geburtstage. Voraussetzung war, so wenig Logik wie möglich in die Anwendung zu bringen um den Pflegeaufwand klein zu halten, das heißt: Alles was per SQL gemacht werden kann soll auch per SQL gemacht werden.

Die Herausforderung war jetzt anhand eines eingetragenen Geburtsdatums, das Datum des kommenden Geburtstages zu berechnen. herausgekommmen ist folgende Formel:

IIF(
    DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()), [geburtsdatum]) <= NOW(),
    DateDiff('d', Now(), DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()) + 1, [geburtsdatum])),
    DateDiff('d', Now(), DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()), [geburtsdatum]))
)

Erklärung:

Zuersteinmal berechne ich das Datum des Geburtstages im aktuellen Jahr, hierfür ziehe ich einfach das Geburtsjahr vom aktuellen Jahr ab und addiere die Differenz zu dem Geburtsjahr hinzu:
DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()), [geburtsdatum])

In der IIF methode prüfe ich nun ob das berechnete Datum vor, oder nach dem aktuellen Datum liegt. Ist es älter, rechne ich ein Jahr dazu und ziehe das aktuelle Datum  davon ab um die Diferenz in Tagen zu erhalten:
DateDiff('d', Now(), DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()) + 1, [geburtsdatum]))

Ist das Datum neuer als das aktuelle, wird ohne ein Jahr hinzuzuzählen, die Differenz in Tagen zum heutigen Datum berechnet:
DateDiff('d', Now(), DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()), [geburtsdatum]))

Auf diese Art erhalte ich die Anzahl der Tage bis zum Geburtstag und kann diese ebenfalls ausgeben. Nachteil an Access SQL ist, dass man scheinbar nicht nach Spaltenaliasen sortieren kann wie beim SQL Server. Daher muss die komplette Formel auch bei der Sortierung (ORDER BY) angegeben werden (es wird logischerweise aufsteigend nach dem berechneten Wert sortiert).

Der komplette SQL String sieht daher (etwas formatiert) so aus:
SELECT TOP 5 * ,
  IIF(
    DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()), [geburtsdatum]) <= NOW(),
    DateDiff('d', Now(), DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()) + 1, [geburtsdatum])),
    DateDiff('d', Now(), DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()), [geburtsdatum]))
  ) AS unterschied
FROM [adressen] 
ORDER BY
  IIF(
    DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()), [geburtsdatum]) <= NOW(),
    DateDiff('d', Now(), DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()) + 1, [geburtsdatum])),
    DateDiff('d', Now(), DateAdd('yyyy', DateDiff('yyyy', [geburtsdatum], Now()), [geburtsdatum]))
  ), [name]

Um das SQL mit SQL Server zu nutzen, müssen natürlich die entsprechenden Datumsfunktionen zum Berechnen verwendet werden.

Posted: Dienstag, 8. Januar 2008 22:10 von Jürgen Gutsch
Abgelegt unter: ,

Kommentare

Peter Bucher sagte:

Tricky :-)

# Januar 8, 2008 23:38
Anonyme Kommentare sind nicht zugelassen