|
|
Sitemap |
Ein Blog-Eintrag von Christian S. (Di 24.05.11 21:46)
Views: 835864
|
Hallo!
Dass man wegen Geburtstagen Stress hat, kommt ja vor. Entweder man hat sie vergessen oder man hat sie ganz knapp nicht vergessen und müht sich ab, ein Geschenk zu finden.
Den etwas anderes Stress macht es, wenn man rauszufinden versucht, wer in diesem Forum am aktuellen Tag Geburtstag hat. Bis vor wenigen Wochen sah unsere Lösung dafür so aus:
SQL-Anweisung 1: 2: 3:
| SELECT user_id, username, user_birthday FROM users WHERE user_birthday <> 1 AND DATE_FORMAT(FROM_UNIXTIME(user_birthday), '%m%d') = '$now' |
wobei $now das Format "md" hatte, also wie die linke Seite in der SQL-Anweisung.
Das Problem: MySQL untertsützt bei FROM_UNIXTIME keinen negativen Werte Mit anderen Worten: Wer zu alt war, fiel durchs Raster.
Hier konnte man nun eine Lösung finden, bei der zu alte Leute auch berücksichtig werden können. Soweit, so gut.
Dummerweise funktioniert diese Lösung anscheinend nicht bei Leuten, die zu jung sind, denen wir zu früh gratuliert.
Ehrlich gesagt habe ich noch nicht verstanden, warum das passiert, aber ab einem Geburtsjahr aum 1989 rum (genau ausprobiert, ab wann es passiert, habe ich noch nicht) liefert die verlinkte Lösung auch Personen, die erst einen Tag später Geburstags hätten.
In der Hoffnung, nun alle Fälle abgedeckt zu haben, sieht die aktuelle Lösung daher so aus:
SQL-Anweisung 1:
| SELECT user_id, username, user_birthday FROM users WHERE (user_birthday < 0 AND DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), INTERVAL user_birthday SECOND), '%m%d') = '$now') OR (user_birthday > 1 AND DATE_FORMAT(FROM_UNIXTIME(user_birthday), '%m%d') = '$now') |
Ein Hoch auf MySQL ... ich brauch 'n Bier.
Christian
P.S.: Ich habe die Lösung noch nicht eingecheckt, vielleicht meldet sich hier ja jemand, der 'ne bessere Idee hat
Kommentar von Martok (Mi 25.05.11 14:36)
*meld*
Oder, sagen wir mal so, ich weiß woran es liegt. Hier kollidieren so viele Zeitzonenlose-/behaftete Datentypen, dass MySQL durcheinander kommt. Kann man ihm nicht verdenken, ich auch. Jedenfalls nachdem ich jetzt weiß, dass FROM_UNIXTIME eigentlich auf TIMESTAMPs arbeitet. Alle andern beteiligten ignorieren das Thema - unter anderem auch DATE_ADD, weil eben user_birthday UnixTime und damit UTC ist und man das so behandeln muss.
Sehr lustig ist dann ja auch der Grund, wie die "Altersgrenze" um 1990 rum zustande kommt: die meißten jüngeren haben sich als Schüler hier angemeldet. Sowas passiert meistens kurz vor Arbeiten und damit fast immer in der Normal(nicht-Sommer-)Zeit
Wo kommt überhaupt diese seltsame Datenstruktur her? Ein Nullable-DATE-Wert wäre doch viel schöner... Und springt nicht munter mit der Sommerzeit durch die Gegend.
Nur die Migration wäre etwas hässlich, irgendwas à la "Ein paar Stunden addieren und den Datumswert davon nehmen".
Kommentar von Regan (Mi 25.05.11 15:35)
*meld*
Warum nehmt ihr Software, deren Support vor über zwei Jahren geendet hat?
Kommentar von Narses (Mi 25.05.11 17:05)
@Regan: Wir supporten doch die Software, ich weiß gar nicht, was du willst...
Kommentar von Regan (Mi 25.05.11 17:16)
@Narses: Dann solltet ihr auch die Verantwortung tragen. Stattdessen wird mir Diskriminierung vorgeworfen
Kommentar von Yogu (So 01.04.12 22:02)
Ich bin mal gespannt, wann sich der erste, der am 1. Januar 1970 Geburtstag hat, beschwert, dass er keine PN erhält
|
|