Datumsproblem

globetrotterxy

Grünschnabel
Hallo zusammen,
vielleicht kann mir hier eine(r) helfen
bastel mir gerade einen Geburtstagscountdown.
und mit dem sortieren des Datums habe ich mein problem.
das Datum habe ich als timestamp in der db gespeichert, nun möchte ich ,das es nicht nach dem ganzen Alter sortiert wird sonder nur nach Monat und Tag zum aktuellem Datun

z.B.

heute 04. 11. 2008

1.) 13. 12. 1961
2.) 03. 05. 1972
3.) 11. 06. 1958

so, das immer den nächste Geburtstag oben steht.

hatte mir schon mal überlegt, für Monat und Tag eine extra Spalte anzulegen.
Aber vielleicht geht es auch einfacher

Gruß Franz
 
Hm .. das hier funktioniert, allerdings ist es "unsauber":

Code:
(SELECT name, date_of_birth FROM test WHERE ( DAYOFYEAR(date_of_birth) - DAYOFYEAR(Curdate())) >= 0 ORDER BY DAYOFYEAR(date_of_birth) asc LIMIT 1000000)
UNION
(SELECT name, date_of_birth FROM test WHERE ( DAYOFYEAR(date_of_birth) - DAYOFYEAR(Curdate())) < 0 ORDER BY DAYOFYEAR(date_of_birth) asc LIMIT 1000000)


a) Index kann nicht benutzt werden und wird bei sehr großen Tabellen langsam
b) das eigentlich überflüsse Hinzufügen des LIMITS ist notwendig, weil sonst die ORDER BY nicht betrachtet werden.

Vielleicht weiß jemand eine besser Möglichkeit
 
Wie Währe es mit sowas:

PHP:
$year = date('Y');
SQL:
SELECT *, DATEDIFF(DATE_FORMAT(`geboren`,'{$year}-%m-%d'), NOW()) as gebin 
FROM `geburtstag` 
HAVING gebin >= 0 AND gebin < 6 
ORDER BY gebin ASC

In gebin würde dann stehen in wieviel Tagen die Geburtstage sind
 
Zuletzt bearbeitet von einem Moderator:
Danke für eure Hilfe, aber ich bin Anfänger und weiß nicht wie ich das anpassen muß.
Die Tabelle heißt geburtstag und die Spalte wo ich den timestamp als int abgespeichert habe heißt auch geburtstag.
ich hatte das bis jetzt so realisiert:

$abfrage = "SELECT * FROM `geburtstag` ORDER BY `geburtstag` ASC ";
$ergebnis = mysql_query($abfrage);

und da hatte ich immer den Ältesten oben

vielleicht kannst du mir ja noch mal helfen

Gruß und Danke
Franz
 
SQL:
SELECT *, DATEDIFF(DATE_FORMAT(FROM_UNIXTIME(`geburtstag`),'{$year}-%m-%d'), NOW()) as gebin 
FROM `geburtstag` 
HAVING gebin >= 0 AND gebin < 6 
ORDER BY gebin ASC

Aber ob das so die sauberste Lösung ist weis ich auch nicht ,) So hatte ich das bei uns mal realisiert, kA ob nich noch nen schreibfehler drin ist oder so. Die Anzahl der Tage wieviel Maximal in die Zukunft kannst hier anpassen: gebin < 6 das sind aktuell die nächsten 5 Tage. Wichtig an der Query ist eben das aktuelle jahr zu verwenden zum vergleichen, das alle auf dem gleichen sind.
 
Zuletzt bearbeitet von einem Moderator:
Hallo zusammen,
Datumsproblem gelöst
Habe einfach noch 3 Spalten zusätzlich gemacht mit den Werten, Tag, Monat und eine mit dem timestamp wonach alle im selben Jahr z.B 2000 geboren sind

Code:
 $anzeige = $heute =  mktime(0,0,0,date("m",time()),date("d",time()),2000);
$abfrage = "SELECT * FROM `geburtstag` WHERE `sortieren` >= $anzeige ORDER BY `monat`,`tag`  ASC ";
  while($row = mysql_fetch_object($ergebnis)) {      }

und danach einfach eine zweite Abfrage für die Geburtstage die vor dem heutgen Tag waren.
Code:
  $abfrage = "SELECT * FROM `geburtstag` WHERE `sortieren` < $anzeige ORDER BY `monat`,`tag`  ASC ";
das wars, man muß nur drauf kommen

Da das jetzt , mache ich mich jetzt dran eine Mailbenachrichtigung einzufügen...

Gruß und nochmal Danke
franz
 
Zurück