Funktionen zum Geburtsdatum
Ben
- datenbank
Hallo zusammen!
Für meine Webpräsenz muss ich Geburtstage in einer Datenbank speichern.
Spontan fallen mir sowohl die Möglichkeiten ein, mit Hilfe des Datentyps DATE Tag, Monat und Jahr abzuspeichern als auch die Geburtstage als Timestamp abzulegen und über PHP in ein lesbares Datum umzuwandeln.
Es sollen folgende drei Funktionen zur Verfügung stehen:
Nach dem Durchsuchen des Forumsarchives half mir folgender Link weiter, löste jedoch noch nicht mein Problem die nächsten Geburtstage anzuzeigen: http://dev.mysql.com/doc/mysql/de/date-calculations.html .
Was könnt Ihr mir empfehlen?
Besten Dank im Voraus,
Holger
hi,
Für meine Webpräsenz muss ich Geburtstage in einer Datenbank speichern.
Spontan fallen mir sowohl die Möglichkeiten ein, mit Hilfe des Datentyps DATE Tag, Monat und Jahr abzuspeichern als auch die Geburtstage als Timestamp abzulegen und über PHP in ein lesbares Datum umzuwandeln.
nimm date. das macht dir das sortieren/auswählen in queries leichter.
Es sollen folgende drei Funktionen zur Verfügung stehen:
- Feststellung, wie alt die Person jetzt ist
(TO_DAYS(NOW()) - TO_DAYS(geburtstag)) / 365
bringt das schon in etwa.
soll es genauer sein (schaltjahre mit einbeziehen), musst du etwas mehr berechnungen anstellen.
http://forum.de.selfhtml.org/archiv/2005/3/t102855/#m633082
- Anzeige aller Geburtstage in einem bestimmten Monat
MONTH() in WHERE-klausel
- Ausgabe der nächsten 5 Geburtstagskinder
da ist etwas mehr überlegung von nöten - besonderes problem ist das über das jahresende "hinausschauen".
man könnte DAYOFYEAR() benutzen - und bei den geburtstagen, deren monat/tag vor dem aktuellen datum liegt, 365 draufaddieren - und dann danach sortierenm, plus LIMIT.
ist aber nur ein denkansatz, noch nicht vollständig.
gruß,
wahsaga
Hi,
nimm date.
das macht dir das sortieren/auswählen in queries leichter.
gute Idee ...
- Ausgabe der nächsten 5 Geburtstagskinder
so habe ich das nicht parat,
aber die Ausgabe aller Geburtstagskinder fuer die naechsten X Tage, kann ich anbieten:
SET @limes = 11;
SELECT
vnam,
geb,
IF(DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb)) YEAR) < CURDATE(),
DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb) + 1) YEAR),
DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb)) YEAR)
) AS akut,
IF(DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb)) YEAR) < CURDATE(),
(YEAR(NOW()) - YEAR(geb) + 1),
(YEAR(NOW()) - YEAR(geb))
) AS Jahre
FROM
persons
WHERE
IF(DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb)) YEAR) < CURDATE(),
DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb) + 1) YEAR),
DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb)) YEAR)
) >= CURDATE()
AND
IF(DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb)) YEAR) < CURDATE(),
DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb) + 1) YEAR),
DATE_ADD(geb, INTERVAL (YEAR(NOW()) - YEAR(geb)) YEAR)
) <= DATE_ADD(CURDATE(), INTERVAL (@limes) DAY)
ORDER BY
akut, vnam
;
Die Variable @limes enthaelt die Anzahl der Tage, fuer die man abfragt.
Das aktuelle Alter steckt da auch schon mit drin.
Und wenn Dir die WHERE-Klausel nicht gefaellt, verwende HAVING.
Dann kann man sich auf "akut" und "Jahre" von SELECT beziehen.
Gruss Norbert