Php-Datumabfrage
Jobbi
- datenbank
Hallo,
meine Frage ist sicherlich simpel, dennoch habe ich keine Lösung gefunden. Es geht um eine MySQL-Abfrage in Php.
$sql = "SELECT xyz FROM datenbank WHERE datum=
und an dieser Stelle weiß ich nicht weiter. Datum soll in einer Frage gestern sein und in einer weiteren vorgestern, sozusagen
WHERE datum=YESTERDAY.
Wäre für Hilfe sehr dankbar!
echo $begrüßung;
$sql = "SELECT xyz FROM datenbank WHERE datum=
und an dieser Stelle weiß ich nicht weiter. Datum soll in einer Frage gestern sein und in einer weiteren vorgestern, sozusagen
Im reichhaltigen Fundus der MySQL-Datums- und Zeitfunktionen findet sich unter anderem DATE_ADD() und DATE_SUB(), die es in der meines erachtens besseren Schreibweise
datum +/- INTERVAL ausdruck einheit
gibt. Also: CURDATE() - INTERVAL 1 DAY wäre das Datum von gestern.
echo "$verabschiedung $name";
Danke!
Ich habe jetzt dieses hier angewendet...
...WHERE date >= CURDATE()-1
allerdings ist dies mit dem Problem behaftet, dass die Anzeige der letzten 24 Stunden erfolgt, es soll aber die Anzeige von 00:00:00 bis 23:59:59 erscheinen.
Und: In meiner Denke wäre dann
WHERE datestamp >= CURDATE()-2
vorgestern, die Anzeige gibt aber dieselben Daten aus wie in der oberen Variante.
Was mache ich falsch? Vielen Dank!
echo $begrüßung;
Ich habe jetzt dieses hier angewendet...
...WHERE date >= CURDATE()-1
Das ist nicht die Syntax, die ich verwendete und so ist sie auch nicht auf der verlinkten Handbuchseite zu sehen. Sie funktioniert auch nicht, wenn du an einen Monatswechsel kommst.
allerdings ist dies mit dem Problem behaftet, dass die Anzeige der letzten 24 Stunden erfolgt, es soll aber die Anzeige von 00:00:00 bis 23:59:59 erscheinen.
Von Anzeige war bisher noch nicht die Rede und da du dich nicht auslässt, was du wie und woraus anzeigen lässt, kann ich dazu nichts sagen.
echo "$verabschiedung $name";
Von Anzeige war bisher noch nicht die Rede und da du dich nicht auslässt, was du wie und woraus anzeigen lässt, kann ich dazu nichts sagen.
Sorry. Also, ich habe eine MySQL Datenbank und möchte dort die Nachrichten des heutigen Tages und die des gestrigen in einer Übersicht ausgeben.
Die MySQL-Referenz ist natürlich sehr umfangreich, zugegebenermaßen für einen Neuling aber schwerlich zu durchschauen (wenn ich mal aus der Sicht eines solchen schreibe).
In meiner (noch recht jungfräulichen) PHP/MySQL-Denke habe ich angenommen, dass es eben einen recht simplen Befehl ala
$sql = "SELECT id,date,ueberschrift FROM news WHERE date = GESTERN";
gibt.
Moin
In meiner (noch recht jungfräulichen) PHP/MySQL-Denke habe ich angenommen, dass es eben einen recht simplen Befehl ala
$sql = "SELECT id,date,ueberschrift FROM news WHERE date = GESTERN";
Ganz so simpel nicht, aber doch recht einfach. Um dein problem mit den 24 Stunden zu umgehen, musst du zuerst den Datumswert als reine Tage setzen und dann diesen Wert - 1 Tag nehmen.
ungefähr so:
$sql = "SELECT id,date,ueberschrift FROM news WHERE TO_DAYS(date) >= (TO_DAYS(CURRENT_DATE)-1)";
WHERE TO_DAYS(date
) wandelt zuerst deinen Datumswert in reine Tage um.
TO_DAYS(CURRENT_DATE)-1
ist der Vergleichswert. Aktuelles Datum - 1 Tag
Sollte eigentlich funktionieren.
Gruß Bobby
Danke, gibt aber leider auch die Daten der letzten 24 Stunden aus :-(
Moin
Danke, gibt aber leider auch die Daten der letzten 24 Stunden aus :-(
Ich hab es gerade nochmal getestet. Und bei mir funktionierts. Es werden die "echten" Tage gerechnet ohne Beachtung von 24 h. Wie sieht dein Query aus?
Gruß Bobby
Moin
Als Beispiel:
SELECT *
FROM changelog
WHERE TO_DAYS( Zeit ) >= ( TO_DAYS( CURRENT_DATE ) -1 )
gibt mir alle Einträge aus der zeit vom 22.01.20089 00:00:00 Uhr bis zum jetzigen Zeitpunkt. ohne Beachtung das jetzt 11:29 Uhr ist.
Welchen Datentyp hast du deiner "date"-Spalte gegeben?
Gruß Bobby
Ich hab es gerade nochmal getestet. Und bei mir funktionierts. Es werden die "echten" Tage gerechnet ohne Beachtung von 24 h. Wie sieht dein Query aus?
...
$result = mysql_query($sql) OR die(mysql_error());
Moin
$result = mysql_query($sql) OR die(mysql_error());
Bitte den richtigen Query (SELECT ... FROM... usw) !!!
Gruß Bobby
...sorry,
$sql = "SELECT id,date,ueberschrift FROM news WHERE TO_DAYS(date) >= (TO_DAYS(CURRENT_DATE)-1)";
Moin
$sql = "SELECT id,date,ueberschrift FROM news WHERE TO_DAYS(date) >= (TO_DAYS(CURRENT_DATE)-1)";
Sollte erstmal stimmen. Welchen Datentyp hat die Spalte "date"
Gruß Bobby
...datetime
Moin
...datetime
dann sollte es eigentlich funktionieren. Da bin ich nun auch etwas ratlos. Wie gesagt, bei mir funktioniert genau DAS.
Welche MySQL-version hast du?
Gruß Bobby
echo $begrüßung;
Ganz so simpel nicht, aber doch recht einfach. Um dein problem mit den 24 Stunden zu umgehen, musst du zuerst den Datumswert als reine Tage setzen und dann diesen Wert - 1 Tag nehmen.
ungefähr so:
SELECT id,date,ueberschrift FROM news WHERE TO_DAYS(date) >= (TO_DAYS(CURRENT_DATE)-1)
Das ist nicht zu empfehlen, denn zum Finden der passenden Zeilen muss die gesamte Tabelle durchlaufen und TO_DAYS() auf jede Zeile angewendet werden. Das kostet Zeit und ein möglicher Index auf der date-Spalte kann auch nicht verwendet werden. Berechnungen ohne Spalten (wie nachfolgend von mir verwendet) müssen nur einmal nach dem Parsen ausgerechnet werden und können dann per Index gesucht werden.
Besser ist
... WHERE date
= CURDATE() - INTERVAL 1 DAY
und diesen Vorschlag machte ich ja schon in meiner ersten Antwort. Wenn date nicht vom Typ DATE ist sondern DATETIME oder TIMESTAMP müsste, wie von Sven angemerkt der Bereich von 0 Uhr bis einschließlich 23:59:59 Uhr berücksichtigt werden. date mit DATE(date
) auf den Datumswert zu reduzieren ergibt das gleiche Full-Table-Scan-Problem wie oben.
... WHERE date
BETWEEN SUBTIME(NOW(), CURTIME()) - INTERVAL 1 DAY AND ADDTIME(SUBTIME(NOW(), CURTIME()), '23:59:59') - INTERVAL 1 DAY
oder kürzer ohne BETWEEN
... WHERE date
>= CURDATE() - INTERVAL 1 DAY AND date
< CURDATE()
echo "$verabschiedung $name";
... WHERE
date
>= CURDATE() - INTERVAL 1 DAY ANDdate
< CURDATE()
Das funktioniert, vielen Dank! Wenn man das in der Anwendung sieht, erscheint es logisch, doch darauf zu kommen...
Vielen Dank, Gruß
...DATE() ergibt eine Fehlermeldung...
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')-1 and untertext=0 ORDER BY date DESC' at line 1
Ich stehe zZ etwas auf dem Schlauch.
echo $begrüßung;
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')-1 and untertext=0 ORDER BY date DESC' at line 1
Die Ursache für Syntaxfehler ist immer vor der angezeigten Stelle zu suchen.
echo "$verabschiedung $name";
Moin!
»» $sql = "SELECT xyz FROM datenbank WHERE datum=
»» und an dieser Stelle weiß ich nicht weiter. Datum soll in einer Frage gestern sein und in einer weiteren vorgestern, sozusagenIm reichhaltigen Fundus der MySQL-Datums- und Zeitfunktionen findet sich unter anderem DATE_ADD() und DATE_SUB(), die es in der meines erachtens besseren Schreibweise
datum +/- INTERVAL ausdruck einheit
gibt. Also: CURDATE() - INTERVAL 1 DAY wäre das Datum von gestern.
Zu beachten wäre dann nur noch, dass die Spalte, mit der verglichen wird, ebenfalls auf das Tagesdatum zu reduzieren ist, sofern es sich nicht um den Datentyp DATE handelt. Die Funktion DATE() ist dafür ideal. Denn ansonsten vergleicht man ein Tagesdatum ohne Uhrzeit (von CURDATE() plus/minus dem Zeitoffset) mit einem Datum mit Uhrzeit - und das ist nicht identisch.
Genauer gesagt: Ein "Tagesdatum ohne Uhrzeit" wird immer als "Tagesdatum plus 00:00:00 Uhr" betrachtet.
Alternativ zum Vergleich zweier Daten mit auf "00:00:00" gepresster Uhrzeit könnte man natürlich auch vergleichen, ob das Datum des Datensatzes im Zeitintervall von 00:00:00 bis 23:59:59 liegt (bzw. 00:00:00 des Folgetages, wenn der kleine Fehler von einer Sekunde akzeptabel ist). Für Abfragen, die mehrere Tage umfassen sollen, ist das sowieso der einzige Weg: "WHERE datum BETWEEN grenzdatum1 AND grenzdatum2".
- Sven Rautenberg