Ben: Funktionen zum Geburtsdatum

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:

  • Feststellung, wie alt die Person jetzt ist
  • Anzeige aller Geburtstage in einem bestimmten Monat
  • Ausgabe der nächsten 5 Geburtstagskinder

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

  1. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. 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