Ungünstiges Format für Usergeburtstag in Usertabelle

Begonnen von k00ni, 10. August 2007, 23:15:02

Vorheriges Thema - Nächstes Thema

k00ni

Das Problem ist, dass dort der Geburtstag eines Users in Form von \'2007-10-07\' abgelegt wird. Schön und gut, wenn ich damit in PHP arbeiten möchte, nur bewirkt das einen Schmerz im Arsch, wenn ich bei den Abfragen mit einem Alter arbeiten möchte.
Ist der User A älter als X oder jünger als Y? So auf den ersten Blick wäre mir da ein UNIX_TIMESTAMP lieber gewesen, auch wenn dieser bei einem Datum unter 1970 in den Minusbereich abstürtzt. Sollte aber nicht schlimm sein, da PHP und MySQL damit klar kommen sollten.
 
Grüße :-/

k00ni

Vorerst werden wir das erstmal so machen, dass wir die Altersabfrage in PHP abhandeln. Vom pSys her hat man ja die Funktion getAge, welche einem ein Alter liefert. Nur schön finde ich das nicht. Mir wäre es lieber gewesen, alles über MySQL zu machen, aber vielleicht habt ihr ja noch eine Idee.
 
Grüße

mahe

Ich versteh dein Problem nicht ...
YYYY-MM-DD, das kann man sogar einfach sortieren ...

http://blog.mahe.at\" rel=\"external nofollow\">http://blog.mahe.at/wp-content/uploads/2007/06/88x31_1.jpg\" alt=\"88x31_1.jpg\">


Ja, diese Signatur dient zur Werbung!


Und dass ich meine Posts wiederfinde ...


k00ni

Wir haben nur das Alter, mit dem wir arbeiten. Keinen Tag, keinen Monat. Du kannst also nicht in einen Unix-Zeitstempel umrechen oder anderweitig arbeiten. Das ist für eine Suche, wo jemand sagen kann, \"älter als\" und \"jünger als\".
Ich bin mittlerweile der Meinung, dass das sogar egal wäre, wie Powie das ablegt, da wir dass so nicht direkt lösen können. Zwecks Zeit, haben wir erstmal das Ding in PHP ausgelagert und überprüfen das Alter dann per getAge. (siehe oben).
Benötigst noch mehr Infos ?

mahe

Ich versteh noch immer nicht worauf die hinaus willst, da man auch ganz einfach mit dem Datum feststellen kann welcher User nun älter ist ...
Auch eine Sortierung klappt damit ohne Probleme ...
Warum habt ihr nur das Alter? Im pSys wird ja das Datum gespeichert ...

http://blog.mahe.at\" rel=\"external nofollow\">http://blog.mahe.at/wp-content/uploads/2007/06/88x31_1.jpg\" alt=\"88x31_1.jpg\">


Ja, diese Signatur dient zur Werbung!


Und dass ich meine Posts wiederfinde ...


k00ni

Wir bauen eine Usersuche auf. Da kann man unter anderem einstellen, wo das Alter der gesuchten Person liegen soll. Also von 13 bis 25 Jahre beispielsweise. Nur hat man da keinen Tag und keinen Monat, was problematisch ist beim Arbeiten mit dem Timestamp oder anderen Funktionen.


k00ni

Hallo,
ich habe keine Funktion gefunden, mit der man ein Alter (z.B. 24 Jahre), so umstellen kann, dass man dann mit einem Geburtstag arbeiten kann. Oder mit der man aus einem Datum (bspw. 2007-10-07) eine \"Altersangabe\" (24 Jahre)  bekommt.
Weiterhin nutzen wir MySQL 4.0.25.
 
Grüße

Das geht aber! /uploads/emoticons/icon_e_wink.gif.3167d127940f44558fbf1ccd9b6d60a9.gif\" alt=\";-)\" />/uploads/emoticons/icon_e_wink.gif.c059000ae48ff64afa53be0962c021f2.gif\" alt=\":wink:\" />

Stellen wir uns vor, User A hat am 05.07.1981 Geburtstag. Wir wollen nun herausfinden, wie alt er jetzt gerade ist:
 

SELECT YEAR(NOW()) - YEAR(\'1981-07-05\');
+----------------------------------+
| YEAR(NOW()) - YEAR(\'1981-07-05\') |
+----------------------------------+
|                               26 |
+----------------------------------+
1 row in set (0,00 sec)

 
 
Passt, ist aber ziemlich sinnlos.
[edit]Die Version ist hierbei egal. YEAR() ist bereits seit MySQL 3 implementiert. Subtraktion und NOW() auch[/edit]

k00ni

Hallo Statler,
danke für das Beispiel, werde das morgen mal implementieren. /uploads/emoticons/icon_e_smile.gif.f7ec63a2b1c3d90a9415e40455642502.gif\" alt=\":-)\" />
[edit]Eine kurze Frage: Wird bei der Berechnung des Alters auch der Tag und Monat berücksichtigt? Oder subtrahierst du nur die Jahreszahlen? (so sieht es für mich nämlich aus)[/edit]
 
Grüße

Noch besser, weil korrekt, ist:
 


SELECT
 DATE_FORMAT(
   FROM_DAYS(
     TO_DAYS(
       NOW()) -
         TO_DAYS(\'1981-07-05\')
       ),
   \'%Y\')+0;

 
 
[edit]
Diese Funktion berücksichtigt auch die vergangenen Tage. Aber das Beispiel oben zeigt gut, wie man mit MySQL Datumsdifferenzen berechnen kann.
[/edit]

Jepp, so benutze ich das auch in verschiedenen Scripten!

k00ni

Ein direktes Absetzen des SQL-Statements funktioniert problemlos über phpMyAdmin, nur per PHP-Skript fährt er an den Baum und meint, dass ein ungültiges MySQL-Result übergeben wurde.
Das SQL-Statement sieht ungefähr so aus:
 

SELECT user.id, value, avatar, nickname, usepm, birthday, gender
FROM sys_pfuser user
LEFT JOIN sys_friends_user_profile_userfields_user userfields ON user.id = userfields.userid
WHERE (
gender = \\\'männlich\\\'
AND avatar  \\\'\\\'
)
AND (
DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( birthday ) ) , \\\'%Y\\\' ) >=13
AND DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( birthday ) ) , \\\'%Y\\\' ) =13
AND DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( birthday ) ) , \\\'%Y\\\' ) <=99
)

 
 
Lass ich den Teil mit dem Datum weg, so läuft das Ding sauber. Hänge ich ihn rein, dann kommt ein Warning (Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource).
 
Jemand eine Idee?

Ja. Fehlermeldungen vor mysql_fetch_array() ausgeben lassen und dann nochmal fragen.

all your base are belong to us / Discord