Aktueller Tag
Gerd H.
- php
Hallo,
ich möchte eine Geburtstagsliste realisieren. leider komme ich mit der MySQL-Abfrage nicht ganz zurecht. Gespeichert sind die Geburtstage als TimeStamp.
Wie bekomme ich den Zeitraum des aktuellen Tages heraus? Also bei wievielen Sekunden der Tag startet und wann er endet? Dann könnte ich das ja mit Operatoren in der Abfrage eingrenzen.
Für Antworten wäre ich dankbar.
Gerd
Ich grüsse den Cosmos,
ich möchte eine Geburtstagsliste realisieren. leider komme ich mit der MySQL-Abfrage nicht ganz zurecht. Gespeichert sind die Geburtstage als TimeStamp.
Wieso greifst du dann nicht einfach mit Datumsfunktionien drauf zu. Dazu gibts in der Doku zu mySQL ein eigenes Kapitel
Möge das "Self" mit euch sein
Wieso greifst du dann nicht einfach mit Datumsfunktionien drauf zu. Dazu gibts in der Doku zu mySQL ein eigenes Kapitel
Irgendwie steige ich da nicht durch. Ich habe nur gefunden, wie ich auf mit Daten arbeiten kann die im Format YYYY-MM-DD Sind
Hi Gerd,
Irgendwie steige ich da nicht durch. Ich habe nur gefunden, wie ich auf mit Daten arbeiten kann die im Format YYYY-MM-DD Sind
Dies entspricht dem Datentysp "Date" in MySQL. Jeder andere Datentyp ist für die Speicherung des Geburtstages suboptimal geeignet.
Solltest du die Geburtstage bisher lediglich als UNIX-Timestamp gespeichert haben, solltest du überlegen, dies zu ändern. Ansonsten bekommst du bereits Probleme bei Personen, die über 36 Jahre alt sind.
Gruß,
Andreas.
Ich grüsse den Cosmos,
Solltest du die Geburtstage bisher lediglich als UNIX-Timestamp gespeichert haben, solltest du überlegen, dies zu ändern. Ansonsten bekommst du bereits Probleme bei Personen, die über 36 Jahre alt sind.
Ich habs noch nie probiert, wie reagiert eigentlich mySQL auf ne negative Timestamp? Nur rein Interessehalber, nicht, das ich nen Sinn darin sehe, das Geburtsdatum als Timestamp zu speichern ;)
Möge das "Self" mit euch sein
Ich habe jetzt folgendes gefunden:
SELECT username
FROM user
WHERE month(geburtsdatum) = month(now()) AND dayofmonth(geburtsdatum)=dayofmonth(now())
Leider erhalte ich kein Ergebnis, auch wenn ich für now() einen Wert einsetze wo ich ein erhalten müsste.
Kann mir jemand weiterhelfen?
Hallo,
also zuerst: Ein TIMEstamp ist für die Speicherung von GeburtsDATEN wie bereits erwähnt nicht besonders sinnvoll, da es Datum _und_ Zeit abspeichert. Ich glaube allerdings kaum, dass der Geburtszeitpunkt auf deiner Seite von Interesse ist :-))
Ansonsten musst du bei den mySQL-Abfragen auf die Datentypen achten. Sowohl NOW() als auch geburtsdatum sind vom Typ TIMESTAMP, während MONTH und DAYOFMONTH auf DATE-Typen arbeiten. Die Konvertierung erfolgt einfach mit DATE(); das aktuelle Datum erhältst du statt über DATE(NOW()) auch schneller mit CURRENT_DATE(). Ansonsten sollte dein Ansatz absolut korrekt arbeiten.
Ich würde an deiner Stelle das Attribut geburtsdatum in einen DATE-Typ umwandeln (ALTER TABLE ...). Dann lautet die Abfrage einfach:
SELECT username
FROM user
WHERE month(geburtsdatum) = month(current_date()) AND dayofmonth(geburtsdatum)=dayofmonth(current_date())
Ansonsten musst du 'geburtsdatum' bei jeder Abfrage erst in ein DATE-Objekt konvertieren:
SELECT username
FROM user
WHERE month(date(geburtsdatum)) = month(current_date()) AND dayofmonth(date(geburtsdatum))=dayofmonth(current_date())
Viele Grüße,
Johannes Röckert
echo $begrüßung;
also zuerst: Ein TIMEstamp ist für die Speicherung von GeburtsDATEN wie bereits erwähnt nicht besonders sinnvoll, da es Datum _und_ Zeit abspeichert. Ich glaube allerdings kaum, dass der Geburtszeitpunkt auf deiner Seite von Interesse ist :-))
Es ist weniger die zusätzliche Zeit-Angabe, die den Feldtyp TIMESTAMP ungeeigneter machen, als vielmehr der eingeschränkte Wertebereich.
TIMESTAMP: 1.1.1970 bis irgendwann im Jahr 2037.
DATE (mit oder ohne TIME): 1.1.1000 bis 31.12.9999 (garantiert. Werte vor 1000 ohne Garantie)
Die Aufgabe von TIMESTAMP-Feldern ist nicht das Speichern von Datums- und Zeitangaben sondern von (aktuellen) Zeitstempeln, um z.B. zu dokumentieren, wann eine Änderung der Daten stattgefunden hat.
Ansonsten musst du bei den mySQL-Abfragen auf die Datentypen achten. Sowohl NOW() als auch geburtsdatum sind vom Typ TIMESTAMP, während MONTH und DAYOFMONTH auf DATE-Typen arbeiten. Die Konvertierung erfolgt einfach mit DATE(); das aktuelle Datum erhältst du statt über DATE(NOW()) auch schneller mit CURRENT_DATE(). Ansonsten sollte dein Ansatz absolut korrekt arbeiten.
Einspruch! TIMESTAMP, DATETIME, etc. sind keine Typen wie String und Integer sondern Feldtypen. Ähnlich wie VARCHAR und CHAR. Beides sind Feldtypen mit teilweise unterschiedlichem Verhalten, die Werte darin sind aber immer Strings. Neben dem eingeschränkten Wertebereich hat ein TIMESTAMP-Feld gegenüber den anderen Datums- und Zeit-Feldtypen noch eine Funktionalität, die bei Eintragen und Ändern von Datensätzen zum Tragen kommt. Ansonsten wird in solch einem Feld ein ganz normaler Datums- und Zeit-Wert wie auch in DATETIME gespeichert. (Das interne Speicherformat kann dabei außer Acht gelassen werden.) Eine Typumwandlung ist nicht erforderlich. Alle auf Werte aus DATETIME-Feldern anwendbaren Funktionen lassen sich auch auf Werte aus TIMESTAMP-Feldern anwenden.
echo "$verabschiedung $name";
Es ist weniger die zusätzliche Zeit-Angabe, die den Feldtyp TIMESTAMP ungeeigneter machen, als vielmehr der eingeschränkte Wertebereich.
Autsch, das ist ja noch schlimmer... hatte ich mir so noch nie vor Augen geführt.
Einspruch! [...] Alle auf Werte aus DATETIME-Feldern anwendbaren Funktionen lassen sich auch auf Werte aus TIMESTAMP-Feldern anwenden.
Statt "musst du" wäre in meiner Antwort "solltest du" angebrachter gewesen. Ich hatte die Anfragen heute Nacht natürlich auch _ohne_ Konvertierung getestet.... was natürlich ging. Aber das muss ja nicht gleich jeder wissen ;-)
Gruß!
Johannes Röckert