# Nächste Geburtstage anzeigen



## Moritz123 (9. November 2003)

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.


----------



## SepteraCore (9. November 2003)

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,


----------



## Moritz123 (9. November 2003)

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.


----------



## Neurodeamon (9. November 2003)

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


----------



## Moritz123 (9. November 2003)

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!


----------



## SepteraCore (9. November 2003)

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.


```
$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.


----------



## Moritz123 (9. November 2003)

alles klar. vielen Dank - das !


----------



## Rosti (26. Dezember 2004)

ICh habe da mal eine frage da ich es so nicht hin bekommen kann man das nicht mit hilfe von z.b.:


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

oder so? Weil ich es sonst nicht hinbgekomme


----------



## Karl Förster (26. Dezember 2004)

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:

```
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


----------



## Rosti (26. Dezember 2004)

Nun ja genau das Problem habe ich ja das es als DATE gespeichert ist werde deins also mal ausprobieren


----------



## Rosti (26. Dezember 2004)

Das geht ja wirklich :-o

DANKE


----------



## dkf (26. Dezember 2004)

SepteraCore hat gesagt.:
			
		

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



Habs getestet: klappt! 

Aber was macht PHP eigendlich, wenn ich das ganze nicht mit der Funktion DATE, sondern mit der Funktion TIME mache?
Ich meine, was habe ich für einen Timestamp für den 01.01.1950? Der müsste ja im negativen Bereich liegen, oder? Klappt das so ohne weiteres?


----------



## meilon (26. Dezember 2004)

Nein, das wird nicht klappen. Die MySQL-Abfrage von Karl Förster ist das, was du brauchst.

mfg


----------



## Karl Förster (29. Dezember 2004)

Wollte nur schnell drauf hinweisen, dass in meiner Lösung noch Fehler drin sind. Jetzt im Praxistest hat sich herausgestellt, dass der heutige Geburtstag zwar angezeigt wird aber mit dem falschen Jahr (nämlich +1). Eine Lösung hab ich bereits fertig, aber ich glaub die wird langsam zu umfangreich um sie hier zu posten. Mich würde interessieren ob es effektivere und leichtere Lösungen gibt.


----------

