tombe
Erfahrenes Mitglied
Ich habe den Fehler gefunden. Es war "eigentlich" noch nicht mal die Abfrage sondern ein Logikfehler.
In dem Moment wenn der Monat des Feldes "bis" kleiner ist als der Monat des Feldes "von", dann muss ins Folgejahr gerechnet werden. Im Moment wurden immer die gleichen Jahreszahlen verwendet.
Dadurch war beim Datensatz mit der ID = 2 das Datum von 01.11.2011 und das Datum bis war 31.03.2011. Somit wäre das bis Datum kleiner als das von Datum und es kann kein Ergebnis bei der Abfrage geben.
Diese Abfrage verknüpft mit CONCAT das Jahr, den Monat und den Tag und wandelt ihn mit CAST in ein gültiges Datum um. Dabei wird beim Feld "bis" geprüft ob hier der Monat kleiner ist als wie beim Feld "von". In diesem Fall wird die Jahreszahl um 1 erhöht.
Mit dieser Abfrage hat es bei mir sowohl mit Datum "28-08-2011" (liefert ID=1) als auch mit obigem Datum "28-11-2011" (liefert ID=2) geklappt.
In dem Moment wenn der Monat des Feldes "bis" kleiner ist als der Monat des Feldes "von", dann muss ins Folgejahr gerechnet werden. Im Moment wurden immer die gleichen Jahreszahlen verwendet.
Dadurch war beim Datensatz mit der ID = 2 das Datum von 01.11.2011 und das Datum bis war 31.03.2011. Somit wäre das bis Datum kleiner als das von Datum und es kann kein Ergebnis bei der Abfrage geben.
SQL:
SELECT id, tag1, tag2,
CAST(CONCAT(YEAR(NOW()), "-", MONTH(von), "-", DAY(von)) AS DATE) AS von,
CAST(CONCAT(IF(MONTH(bis) <= MONTH(von), YEAR(NOW())+1, YEAR(NOW())), "-", MONTH(bis), "-", DAY(bis)) AS DATE) AS bis
FROM preis
HAVING '2011-11-28' BETWEEN von AND bis
LIMIT 1
Diese Abfrage verknüpft mit CONCAT das Jahr, den Monat und den Tag und wandelt ihn mit CAST in ein gültiges Datum um. Dabei wird beim Feld "bis" geprüft ob hier der Monat kleiner ist als wie beim Feld "von". In diesem Fall wird die Jahreszahl um 1 erhöht.
Mit dieser Abfrage hat es bei mir sowohl mit Datum "28-08-2011" (liefert ID=1) als auch mit obigem Datum "28-11-2011" (liefert ID=2) geklappt.