Screenshot einer aus MySQL ausgelesener Geburtstagsliste

Puh, das war ein hartes Stück Arbeit. Für ein aktuelles Projekt, welches ich mit CakePHP umsetze, war es nötig aus einer Mitarbeiterdatenbank alle Geburtstagskinder der nächsten bzw. letzten 5 Tage auszulesen, und dazu auch gleich das Alter und die Tage bis zum Geburtstag zu berechnen.

Mit Hilfe des Tutorials-Forums kam ich auf den richtigen Weg, und habe nun einen MySQL-Query, der sowohl mit Schaltjahren, als auch Jahresübergängen einwandfrei zu funktionieren scheint. Da ich sicherlich nicht der letzte mit diesem Problem bin, wollte ich euch den Query nicht vorenthalten…

Hier mein SQL-Query


SELECT
	`id`,
	`name`,
	`vorname`,
	`geburtstag`,
	YEAR( CURRENT_DATE( ) ) - YEAR( geburtstag )
	age,
	DATEDIFF(`geburtstag` + INTERVAL 
	(YEAR(CURRENT_DATE) - YEAR(`geburtstag`) +
	IF(DATE_FORMAT(CURRENT_DATE, "%m%d") > 
	DATE_FORMAT(`geburtstag`, "%m%d"), 1, 0))
	YEAR, CURRENT_DATE) AS `days_to_birthday`
FROM
	`xxx_mitarbeiter`
HAVING
	`days_to_birthday` <= 6 OR
	`days_to_birthday` >= 360
ORDER BY
	days_to_birthday

Zur Erklärung:

Der Query selektiert zuerst einmal alle “normalen” Felder. Danach wird ein virtuelles feld age angelegt, welches durch eine Subtraktion das “zukünftige” Alter beinhaltet. Danach werden dann in einem weiteren virtuellen Feld, days_to_birthday ,die Tage bis zum nächsten Geburtstag abgelegt.

Hinweis: Die Geburtstage müssen den Feldtyp DATE oder DATETIME tragen, also im Format YYYY-MM-DD bzw. YYYY-MM-DD HH:MM:SS vorliegen.

Zum Schluss werden durch HAVING alle Geburtstag der nächsten 6 Tage selektiert, und darunter die der letzten 6 Tage (logisch, da der nächste Geburtstag der Person dann ja wieder 36x Tage entfernt liegt.

Man gebe noch etwas PHP, HTML & CSS hinzu, rühre drei mal um, und erhält dann evtl. so etwas ähnliches wie auf dem Artikelbild.

Ich hoffe das hilft einigen Geplagten weiter :)



Kommentare zum Thema Aktuelle Geburtstage aus MySQL-Datenbank auslesen:

1 | Eric Rappsilber schrieb am 27.06.2007 um 12:27
Gravatar dieses Kommentators

Hallo Christian,

du hast mir der obrigen SQL-Query einige Stunden Arbeit abgenommen.
Vielen Dank dafür.

2 | Reiseleiter schrieb am 06.07.2007 um 12:16
Gravatar dieses Kommentators

Jo auch von mir ein dickes Danke!

3 | Marc schrieb am 12.07.2007 um 17:04
Gravatar dieses Kommentators

Danke, dass Copy & Paste abgeschaltet ist. Ziemlich sinnvoll, wenn man einen Quelltext anbietet ;)

4 | Christian schrieb am 15.07.2007 um 17:50
Gravatar dieses Kommentators

Keine Ahnung was für komische Programme du nutzt, aber bei mir kann jeder Kopieren und Einfügen soviel er will, ich glaube das kann jeder mit einem ganz normalem Browser auch bestätigen…

5 | acid@vega schrieb am 23.07.2007 um 17:35
Gravatar dieses Kommentators

THX hat mir auf jeden weiter geholfen besser als die ganzen php lösugen die ich gefunden habe

6 | Joern schrieb am 13.01.2008 um 11:41
Gravatar dieses Kommentators

Sehr schönes SQL-Script, danke!

7 | Andreas schrieb am 31.01.2008 um 15:44
Gravatar dieses Kommentators

Hallo,
vielen Dank für dieses super Script.

Ich arbeite gerade an einem privaten Projekt bei dem unteranderem auch ein Geburtstagsprüfer benötigt wird und da hat mir dieses Script eine Menge Arbeit abgenommen.

Mein erster Ansatz war folgender:

select `name` from person where
(YEAR)-YEAR) – (RIGHT,5)<RIGHT)
<>
(CURDATE(">YEAR, INTERVAL 7 day))-YEAR) – (CURDATE(">RIGHT, INTERVAL 7 day),5)<RIGHT)

Ist aber lange nicht so flexibel wie die Lösung von dir :)

8 | Charlie schrieb am 21.03.2008 um 14:26
Gravatar dieses Kommentators

Super! Hab mir mit meinem Versuch echt die Zähne ausgebissen und lag immer noch einen Tag daneben.

9 | Martin schrieb am 29.03.2008 um 11:33
Gravatar dieses Kommentators

Vielen Dank.
Der beschriebene Code hat mir gerade viel Arbeit erspart!

10 | Matthias schrieb am 18.06.2008 um 04:15
Gravatar dieses Kommentators

Auch von mir ein danke für diesen SQL Schnippsel :)

11 | Philip schrieb am 25.07.2008 um 13:22
Gravatar dieses Kommentators

bei mir funktionierts nicht :(

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in geburtstag.php on line 20

12 | larryson schrieb am 12.08.2008 um 21:28
Gravatar dieses Kommentators

Funktioniert Super, vielen Dank

13 | 0xAffe schrieb am 24.08.2008 um 16:17
Gravatar dieses Kommentators

Das Alter wird im Dezember bei Leuten die im Januar Geburtstag haben nicht korrekt berechnet, ansonsten sehr schön :-)

14 | Carsten von Skrbensky schrieb am 31.08.2008 um 14:12
Gravatar dieses Kommentators

Danke für deinen Gehirnschmalz :)

15 | André (PN Admin) schrieb am 07.01.2009 um 14:27
Gravatar dieses Kommentators

Auch ich bedanke mich.
Hatte bei meinem Ansatz über den WHERE-Teil eine kleine Blockade und kam so zu deiner Lösung, die gleich um vieles besser funktioniert.
Wunderbar.

16 | Luke schrieb am 07.02.2009 um 12:12
Gravatar dieses Kommentators

funzt das auch über einen jahreswechsel hinweg? vor allem das “zukünftige alter” sieht mir da gefährlich aus nach der methode … (also geb am 02.01. und heute ist der 31.12.)

17 | Luke schrieb am 07.02.2009 um 13:09
Gravatar dieses Kommentators

Jap …

+ IF(DATE_FORMAT(CURRENT_DATE, “%m%d”) > DATE_FORMAT(`geburtstag`, “%m%d”), 1, 0)

… fehlt beim zukünftigen-age-selecten auch noch (für Jahresüberlauf)

18 | Flo schrieb am 25.04.2009 um 14:06
Gravatar dieses Kommentators

“Man gebe noch etwas PHP, HTML & CSS hinzu,…”
Könnte das jemand etwas konkretisieren?

Bin neu in dem Sektor und wüßte gerne, wie ich die Geburtstagskindern denn nun auch ausgeben kann…
Würde mir jemand helfen?

Vielen Dank für das tolle Skript!!

19 | Gabriel schrieb am 08.09.2009 um 00:48
Gravatar dieses Kommentators

Sorry, Dein Code in Bezug auf das Alter ist falsch. Da Deine Homepage den SQL Code zerstört hier im Klartext. So geht’s:

Jahr(Aktuelles Datum)-Jahr(Geburtstag) – ((Monat-Tag-Aktuelles Jahr) < Monat-Tag-Gebrutstag) as age —-> 1 wird abgezogen wenn Geburtstag noch nicht vorbei

Du hast vergessen, dass man ja schon ein Jahr älter ist, wenn der Geburtstag vorbei ist, obwohl das Jahr das gleich ist. Diese Code kann man dann auch anstellen des umständlichen if verwenden.

20 | bjoern schrieb am 20.11.2009 um 21:38
Gravatar dieses Kommentators

Danke! Danke! Danke!
Habe selbst schon so einiges gebastelt, war aber nicht wirklich zufrieden. Hier ist die perfekte Lösung. (Nr 17 beachten!)

21 | nixtauger schrieb am 07.04.2010 um 11:13
Gravatar dieses Kommentators

Für die, die es nicht ganz so kompliziert braucht und nur die Leute haben will, die z.b. in den nächsten 7 tagen b-day haben, wäre mein Vorschlag:
WHERE MONTH (bday) = MONTH (NOW ()) AND (DAY (bday) BETWEEN DAY (NOW ()) AND DAY (ADDDATE (NOW (), 6)))
ACHTUNG: die ganzen Leerzeichen wieder entfernen, ohne die wäre der query von der blogsoftware nicht akteptiert und verunstaltet worden…

22 | nixtauger schrieb am 07.04.2010 um 13:30
Gravatar dieses Kommentators

UPS sorry, mir fällt auf ich hatte nen kleinen Denkfehler. Das funktionierte nur, wenn die folgenden 6 Tage noch im gleichen Montag liegen.
So sollte es aber glaub gehen:
(CONCAT_WS (’-’, YEAR (NOW ()), MONTH (bday), DAY (bday)) BETWEEN SUBDATE (NOW (), 1) AND ADDDATE (NOW (), 6))

23 | Jannik schrieb am 11.05.2010 um 08:20
Gravatar dieses Kommentators

Super query!!!
Hat mir sehr geholfen und mir bei der Weitergestaltung viele Anstöße gegeben!

DICKES DANKE ;)

24 | Mochegübchen schrieb am 14.10.2010 um 14:11
Gravatar dieses Kommentators

Ich brauche ein Geburtstagsscript, das mir jeden Monat die geburtstagskinder anzeig tdie in dem Monat geburtstag haben und das script soll sich automatisch aktuallisieren wenn der nächste monat kommt. also immer am 1. des monats die neue Liste. Mit tag monat und Jahr und vielleicht noch in Klammern dahinter, wie alt man wird. Habe bisher noch keine erfahrung mit php mysql. Bsher habe ich meine geburtstage immer manuell eingetragen in eine Div-Box. Link zur Seite ist bei meinem namen. Einfach mal klicken und bitte helfen. ich verpass es manchmal die geburtstage am 1. einzutragen und deshalb wurden schon einige Geburtstagskinder vergessen und waren ziemlich sauer auf mich.

Kommentar-Feed für diesen Artikel


Kommentarfunktion für diesen Artikel geschlossen.



Blogsuche

RSS-Feeds

Plaste & Plastik

plasteundplastik.de - Das Geocaching-Weblog

Die Kategorien


Netz-Fundstücke


Meta / Propaganda