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.