Einer zum Nachdenken...

V

Vaethischist

Ich hab 'ne Datenbank mit einer Relation, die ein Geburtsdatum enthält. Jetzt möchte ich mit SQL eine Anfrage basteln, die mir sagt wer als nächstes Geburtstag hat.

Jemand 'ne Ahnung?
 
Grob:
Feststellen welches Datum heute ist. Datum muss in Variable in gleichem Format wie in DB vorliegen (z.B. YYYY.MM.DD)

Liste sortieren nach Datum "SELECT Name, Geburtstag FROM Tabelle WHERE Geburtstag >= $heute LIMIT 0,3"

Damit kriegst du aus der DB die nächsten 3 Geburtstagskinder mit Namen.:)

Hoffe das hilft dir.

Greetz :|
 
fehlt da zum Sortieren nicht das ORDER BY?

Code:
"SELECT Name, Geburtstag FROM Tabelle WHERE Geburtstag >= $heute ORDER BY Geburtstag LIMIT 0,3"
 
Doch, klar. Wollte nur warten wers als erster merkt :) :) :)

Is natürlich quatsch, in der eile vergessen triffts da eher

and so on... :|
 
Danke erst mal für die Hilfe!

Trotzdem hab ich so meine Bedenken...

Wenn ich 'ne Liste von Tupeln nach Datum sortiere, dann sieht das (beim Datentyp DATE) so aus (oder nich'?!):

01.10.1967
23.12.1968
01.10.1969
10.03.1976

Wenn ich das Datum in der Liste mit dem aktuellen vergleiche, dann ist das doch sowieso immer größer als in der DB (loggesch, weil sonst der Mensch noch gar nich' geboren wäre und deshalb auch net in der DB sein kann!). Also bekomme ich mit eurer Anfrage immer eine nach Datum sortierte Liste, auch ohne den Vergleich zu machen.

Wenn dem so sein sollte, dann gibts folgendes Problem:

Angenommen es wäre heute der 30.12.2002. Die List kommt so raus wie oben und das LIMIT läßt den 4. Eintrag verschwinden. Also hätten angeblich die ersten 3. Leute als nächstes Geburtstag, tatsächlich hat aber der 4. (der verschwundene) als nächstes Geburtstag.

Ergo: Ich muß wohl 'n Vergleich ohne Jahreszahl machen...geht aber nich', weil EXTRACT bloß mit DATETIME und INTERVAL kann.

Lösung: Geburtsdatum als CHAR(10) in die DB...dann geht eure Variante.

Hab ich jetzt überhaupt irgendwas richtig verstanden, oder bin ich wirklich zu doof?!

*need advice*
 
1. wer sich wenigstens ein bissl mit MySQL auskennt kann nicht "doof" sein ;)

2. Also bei mir kommen Einträge ins DATE FORMAT so rein: YYYY-MM-DD
also 1967-10-01. Das Sortieren des Datums klappt meines Wissens mit MySQL auch ohne Probs, lasse mich aber auch gerne belehren.

3. hmm, stimmt der Vergleich mit dem heutigen Datum kann so net klappen, aber du kannst ja die Daten anhand des "-" bzw. des "." exploden und dann die Tages- und Monatsstellen mit dem heutigen Datum vergleichen.

Das Datum als VARCHAR eintragen macht nur sinn, wenn du das Datum sowiso IMMER zwingend manuell einträgst, wen du es aus ner Funktion generieren lässt isses einfacher das dann direkt als DATE zu speichern.

Greetz :|
 
also ich trage datums/zeitangaben grundsätzlich als timestamp, php funktion: time(), ein.

zum geburtstagsproblem gäbe es dann folgende lösung:
man ermittelt den aktuellen Tag im jahr mit

$today=strftime("%j",time());
(ergibt eine Zahl von 1 bis 365 bzw. 366)

liest dann alle Datensätze aus, ermittelt jeweils den Jahrestag
$yearday=strftime("%j",$data[time]);

und wählt dann denjenigen aus, bei dem die Differenz $yearday-$today den kleinsten Wert annimmt, der aber mindestens Mull sein muss.

sollte kein Datensatz diesen Bedingungen entsprechen, bedeutet das, dass in diesem Jahr keiner mehr Geburtstag hat, in diesem Fall hat als nächstes derjenige Geburtstag, der als erstes im Jahr Geburtstag hat. (3x Geburtstag in einem Satz, wow :))

hier nun der Code:

PHP:
$today=strftime("%j",time());
$mintoday=1000;
$minyear=1000;
$firstgebtoday="";
$firstgebyear="";


$command="SELECT name, time FROM tabelle";
$result=mysql_query($command);

while ($data=mysql_fetch_array($result)){
 $yearday=strftime("%j",$data[time]);
 $differenz=$yearday-$today;
 if (($differenz>=0)&&($differenz<$mintoday){
  $mintoday=$differenz;
  $firstgebtoday=$data[name];
 }
 if ($yearday<$minyear){
  $minyear=$differenz;
  $firstgebyear=$data[name];
 }
}

//das nächste Geburtstagskind wird ausgegeben:
if ($firstgebtoday)
 if ($mintoday) echo "$firstgebtoday hat demnächst Geburtstag"; 
 else echo "$firstgebtoday hat heute Geburtstag"; 
else echo "$firstgebyear hat demnächst Geburtstag";

ok, das müsste so eigentlich klappen
 
Zuletzt bearbeitet:
Zurück