Zur Navigation

SQL-Abfrage mit aktuellem Datum

1 AndiN

Ich hänge gerade an einem kleinen SQL-Problem fest. Ich möchte aus einer Anzahl von Veranstaltungen immer die zwei in nächster Zukunft anzeigen lassen. Aktuell habe ich das hier:

select * from $events order by year, month, day Limit 0,2

Das funktioniert auch schonmal wenn ich vergangene Events manuell aus der Datenbank lösche.
Das möchte ich jedoch nicht.
D.h. ich benötige in dem SELECT noch einen Vergleich des aktuellen Datum mit dem im jeweiligen Event eingetragenen Datum.
Daran scheitere ich jedoch aktuell leider.

Im Netz habe ich noch folgenden Schnippsel gefunden...
SELECT....WHERE (datum <CONVERT(DATETIME,'01.10.2013', 104)
... aber irgendwie bekomme ich das nicht zusammengestrickt.

27.12.2013 16:39

2 Jörg Kruse

Ich würde es so versuchen:

SELECT *, CONCAT_WS('-', year, LPAD(month, 2, 0), LPAD(day, 2, 0)) AS date
FROM events
ORDER BY date
HAVING date > CURDATE()
LIMIT 2

... wobei ich davon ausgehe, dass in `year` nur vierstellige Jahreszahlen stehen

Besser wäre es natürlich, wenn das Datum gleich in einem DATETIME Feld gespeichert würde - dieses kann man ohne Konvertierung vergleichen und daraus lassen sich mit den Datumsfunktionen von MySQL leicht Tag, Monat und Jahr extrahieren. Das wäre zudem performanter, da man dann WHERE statt HAVING benutzen könnte.

27.12.2013 17:42 | geändert: 27.12.2013 17:46

3 AndiN

Da erscheint dann folgende 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 'HAVING date > CURDATE()' at line 1
SELECT *, CONCAT_WS('-',year,LPAD(month,2,0),LPAD(day,2,0)) AS date FROM events ORDER BY date HAVING date > CURDATE()

Eingesetzt wird PHP 5.3.3-7+squeeze18.

28.12.2013 00:34

4 Jörg Kruse

Eigentlich gehört "DATE" zu den Schlüsselwörtern, die bei MySQL ausnahmsweise als Identifier benutzt werden dürfen:

http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

Möglicherweise stolpert MySQL hier dennoch darüber. Also entweder du ersetzt den Alias "date" hier durch einen anderen Identifier (z.B. "event_date") oder quotest ihn mit Backticks:

SELECT *, CONCAT_WS('-', year, LPAD(month, 2, 0), LPAD(day, 2, 0)) AS `date`
FROM events
ORDER BY `date`
HAVING `date` > CURDATE()
LIMIT 2

Eingesetzt wird PHP 5.3.3-7+squeeze18.

Die PHP-Version ist hier unerheblich, es handelt sich ja um eine Fehlermeldung seitens MySQL :)

28.12.2013 08:17 | geändert: 28.12.2013 08:18

5 AndiN

Das Problem ist leider quasi das Gleiche:
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 'HAVING 'date' > CURDATE() LIMIT 2' at line 1
SELECT *, CONCAT_WS('-',year,LPAD(month,2,0),LPAD(day,2,0)) AS 'date' FROM events ORDER BY 'date' HAVING 'date' > CURDATE() LIMIT 2

Bzgl. PHP-Version... ähm ja... wenn man mal drüber nachdenkt hast du Recht. ;-)

mySQL-Version wäre hier übrigens 5.1.72

28.12.2013 12:37 | geändert: 28.12.2013 12:39

6 Jörg Kruse

Der Identifier date muss in Backticks gesetzt werden (`date`), nicht in Hochkommata ('data'); oder halt einen anderen Namen wählen, wie event_date, das kann ohne Backticks verwendet werden.

28.12.2013 13:20

7 AndiN

Hm... sowohl `date` als auch event_date sorgen für die identische Fehlermeldung. Ich glaube da ist noch irgendwo anders der Wurm drin.

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 'HAVING event_date > CURDATE() LIMIT 2' at line 1
SELECT *, CONCAT_WS('-',year,LPAD(month,2,0),LPAD(day,2,0)) AS event_date FROM events ORDER BY event_date HAVING event_date > CURDATE() LIMIT 2

bzw.

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 'HAVING `date` > CURDATE() LIMIT 2' at line 1
SELECT *, CONCAT_WS('-',year,LPAD(month,2,0),LPAD(day,2,0)) AS `date` FROM events ORDER BY `date` HAVING `date` > CURDATE() LIMIT 2

Wenn ich den Code im phpMyAdmin teste erhalte ich folgende Fehlermeldung:

#1064 - 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 'HAVING event_date &gt; CURDATE() LIMIT 2' at line 1

Interessant finde ich ist, dass er aus ">" hier "&gt;" macht. Könnte das des Rätsels Lösung sein?

28.12.2013 13:33

8 Jörg Kruse

Die Reihenfolge der Statements ist falsch. Ich habe mich durch diesen Satz im deutschsprachigen Manual irreführen lassen:

Die HAVING-Klausel wird fast als Letztes angewandt – unmittelbar bevor die Elemente an den Client gesendet werden, und ohne Optimierung. (Nur LIMIT wird noch nach HAVING angewandt.)

Der Satz bezieht sich aber auf die interne Ausführung der Query, nicht auf die Reihenfolge der Statements

So sollte es gehen:

SELECT *, CONCAT_WS('-', year, LPAD(month, 2, 0), LPAD(day, 2, 0)) AS `date`
FROM events
HAVING `date` > CURDATE()
ORDER BY `date`
LIMIT 2

28.12.2013 14:06 | geändert: 28.12.2013 14:06

1 Forenmitglied fand diesen Beitrag gut

9 AndiN

Hurra, läuft! Danke!

28.12.2013 14:12

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]