21 Jun, 2009 von Benjamin Erb
Abfrage von auftretenden Jahrestagen (wie Geburtstagen) mit MySQL
Viele Datenbanken mit Personendaten enthalten Geburtsdaten. So ist eine typische Abfrage das Ermitteln von Personen, die in den nächsten Tagen Geburtstag haben oder in den vergangenen Tagen hatten. Eine solche Abfrage gestaltet sich aus verschiedenen Gründen komplizierter. Einerseits müssen alle Eigenheiten bei der Kalkulation mit Daten beachtet werden (z.B. Schaltjahre), andererseits möchte man ungern die kompletten Daten aus der Datenbank ziehen und dann erst dann mit einer weiteren Programmiersprache verarbeiten und berechnen, sondern direkt die Schnelligkeit und Funktionalität der Datenbank nutzen. Aus diesem Grund möchte ich hier meinen Versuch vorstellen, dieses Problem mit MySQL zu lösen. Ziel war es, eine Ergebnis zu bekommen, das auflistet, welche Personen innerhalb eines definierbaren Zeitraums Geburtstag hatten oder noch Geburtstag haben und wie alt die Person jeweils geworden ist oder wird. Das Feld ‘birthday’ soll hierbei ein Datenfeld vom Typ Date sein. Hier werden alle Geburtstage zwischen vergangener Woche und den kommenden zwei Wochen chronologisch aufgelistet:
SELECT `name`, `birthday`, @nextBirthday := `birthday` + INTERVAL (YEAR(CURRENT_DATE) - YEAR(`birthday`) + IF(DATE_FORMAT(CURRENT_DATE, "%m%d") > DATE_FORMAT(`birthday`, "%m%d"), 1, 0)) YEAR, @prevBirthday := @next - INTERVAL 1 YEAR, @daysNext := DATEDIFF(@nextBirthday, CURRENT_DATE), @daysPrev := DATEDIFF(@prevBirthday, CURRENT_DATE), IF(ABS(@daysPrev) < @daysNext,@daysPrev +0 ,@daysNext+0) AS `days`, IF(ABS(@daysPrev) < @daysNext,YEAR( @prevBirthday ) - YEAR( `birthday` ),YEAR( @nextBirthday ) - YEAR( `birthday` )) AS `age` FROM `table` HAVING `days` BETWEEN -7 AND 14 ORDER BY `days` ASC
Die Grundidee ist relativ einfach. Es wird mithilfe von MySQL-Datumsfunktionen berechnet, wann die Person das nächste Mal Geburtstag hat und wann sie das letzte mal hatte. Nun wird geprüft, welches Ereignis aktueller ist und entsprechend die Werte ‘days’ und ‘age’ belegt. Mithilfe der HAVING-Klausel lässt sich außerdem die Ergebnismenge eingeschränken auf einen bestimmten Zeitraum.
Originalartikel: Abfrage von auftretenden Jahrestagen (wie Geburtstagen) mit MySQL
Letzte Kommentare