Nächste Geburtstage anzeigen

Moritz123

Erfahrenes Mitglied
Hallo!

ich habe ein Online-Adressbuch geschrieben. Es werden dort Adressen und andere pers. Angaben in einer Datenbank gespeichert; ua auch die Geburtsdaten.
Ich möchte nun die Geburtstage, die sagen wir 10-20 Tage vom aktuellen Datum weg liegen, anzeigen. Da die Daten im "normalen" Format (also zB 01.01.1970) in der Datenbank stehen, müssen sie evtl erst noch umgerechnet werden.
Ich leider keine Ahnung wie das Ganze realisieren soll, daher wäre ich für einen Denkanstoß sehr dankbar.
 
Also vom Prinzip her ist das relativ simpel denke ich.
Du nimmst den aktuellen Timesamp und den Timestamp von in 10-20 Tagen (time()+60*60*24*10) und guckst eben ob der Timestamp vom Geburtstag dazwischen liegt, wenn ja zeigst du das Datum an oder nicht.
Funktionen die dir dabei helfen könnten sind
http://www.php.net/time
http://www.php.net/mktime

Es wäre evtl. aber besser wenn der Geburtstag in einem Timestamp in der Datenbank steht und man nur die ausliest die im passenden Zeitraum liegen,
 
Hallo!
ich glaube ich brauche noch mehr schützenhilfe, weil ich irgendwie einen denkfehler mache. ich habe das jetzt so gemacht:
Ich hole das Datum aus der DB und wandle es in eine timestamp um.
Dann hole ich mit time() die aktuelle Timestap und nehme sie mit 60*60*24*10 mal.
Und hier hört es bereits auf. So sind nach Differenzbildung beispielsweise bis zum 1.12. 10 Tage. das kann ja irgendwie nicht sein.
 
Die aktuelle Timestamp wird ja auch nicht mit 60*60*24*10 malgenommen, sondern timstamp PLUS 60*60*24*10 (also timestamp + 864000).
Wenn Du das multiplizierst landest du verdammt weit in der zukunft ;) bzw. an der Grenze des Betriebssystems (bei unix nicht, aber bei Windows z. B).
 
Meinte ich ja :) Ich addiere das natürlich. Trotzdem kommt Unsinn heraus. Könnte mir nochmal jemand sagen, was _konkret_ ich wie rechnen muss? Muss ich auch das Jahr mit einbeziehen?
Vielen Dank!
 
Also mein vorheriger Vorschlag war ein bischen undurchdacht, denn der Timestamp von Geburtstag liegt logischer weise vor dem heutigen Datum und würde somit überhaupt nicht angezeigt werden.

PHP:
$geburtstag // in dieser Variable ist der Geburtstag gespeichert (z.b. 01.01.1970)
$tage = 10; // in $tage wird der Zeitraum von jetzt an festgelegt
$jetzt = time();
$spaeter = $jetzt+60*60*24*$tage
$geb = explode(".",$geburtstag);  // Das Datum des Geburtstages wird aufgeteilt
$geb_timestamp = mktime(0,0,0,$geb[1],$geb[0],date("Y"));  // Der Timestamp des Geburtstages in diesem Jahr wird erstellt
if (($jetzt < $geb_timestamp) && ($spaeter > $geb_timestamp)) echo $geburtstag."<br />";

Das dürfte so in etwa funktionieren.
 
ICh habe da mal eine frage da ich es so nicht hin bekommen kann man das nicht mit hilfe von z.b.:

PHP:
WHERE bday < date_add(current_date, interval +14 day)

oder so? Weil ich es sonst nicht hinbgekomme :D
 
Ich hab vor ca. 2 Wochen auch an dem Problem gesessen. In meiner Datenbank ist das Geburtsdatum als DATE, also in der Form YYYY-MM-DD gespeichert. Aufgabenstellung war an meiner Seite: Erstelle 1 SQL-Anweisung, die die Id, Nickname, das neue Alter desjenigen, das Geburtsdatum selbst und das Datum, an dem derjenige als nächstes Geburtstag hat innerhalb eines frei zu definierenden Zeitraums filtert.

Folgende Anweisung funktioniert bei mir um z.B. alle Leute zu filtern, die inkl. heute und der nächsten 2 Monate Geburtstag haben:
PHP:
SELECT 
  Id, 
  Nickname,
  IF ((YEAR(CURRENT_DATE) - YEAR(Geburtsdatum)) > 0, 
    (YEAR(CURRENT_DATE) - YEAR(Geburtsdatum)) - (MID(CURRENT_DATE, 6, 5) < MID(Geburtsdatum, 6, 5)),
    IF ((YEAR(CURRENT_DATE) - YEAR(Geburtsdatum)) < 0, 
      (YEAR(CURRENT_DATE) - YEAR(Geburtsdatum)) + (MID(Geburtsdatum, 6, 5) < MID(CURRENT_DATE, 6, 5)), 
      (YEAR(CURRENT_DATE) - YEAR(Geburtsdatum))
    )
  ) +1 AS `alter`, 
  Geburtsdatum, 
  DATE_FORMAT(DATE_ADD(Geburtsdatum, INTERVAL 
    IF ((YEAR(CURRENT_DATE) - YEAR(Geburtsdatum)) > 0, 
      (YEAR(CURRENT_DATE) - YEAR(Geburtsdatum)) - (MID(CURRENT_DATE, 6, 5) < MID(Geburtsdatum, 6, 5)),
      IF ((YEAR(CURRENT_DATE) - YEAR(Geburtsdatum)) < 0, 
        (YEAR(CURRENT_DATE) - YEAR(Geburtsdatum)) + (MID(Geburtsdatum, 6, 5) < MID(CURRENT_DATE, 6, 5)), 
        (YEAR(CURRENT_DATE) - YEAR(Geburtsdatum))
      )
    ) +1YEAR), '%Y-%m-%d') AS zeit
FROM tabelle
WHERE
  (CONCAT(YEAR(NOW()), '-', DATE_FORMAT(Geburtsdatum, '%m-%d')) >= DATE_FORMAT(CURRENT_DATE, '%Y-%m-%d'))
  AND
  (CONCAT(YEAR(NOW()), '-', DATE_FORMAT(Geburtsdatum, '%m-%d')) <= DATE_FORMAT(DATE_ADD(CURRENT_DATE, INTERVAL 2 MONTH), '%Y-%m-%d'))
  )
  OR 
  ((CONCAT(YEAR(NOW()) +1, '-', DATE_FORMAT(Geburtsdatum, '%m-%d')) >= DATE_FORMAT(CURRENT_DATE, '%Y-%m-%d'))
  AND 
  (CONCAT(YEAR(NOW()) +1, '-', DATE_FORMAT(Geburtsdatum, '%m-%d')) <= DATE_FORMAT(DATE_ADD(CURRENT_DATE, INTERVAL 2 MONTH), '%Y-%m-%d'))
  )
ORDER BY zeit ASC

Tschuldigung .... die Abfrage is nunmal so lang :D
 
Zurück