Preistabellen für Haupt- und Nebensaision

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.

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.
 
Hallo,

bei mir kommt diese 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 'CAST(CONCAT(YEAR(NOW()), &quot;-&quot;, MONTH(start), &quot;-&quot;, DAY(start)) AS DATE) AS start,
' at line 2
 
Nein...

SQL:
SELECT * CAST( CONCAT( YEAR( NOW( ) ) , "-", MONTH(
START ) , "-", DAY(
START ) ) AS DATE ) AS
START , CAST( CONCAT( IF( MONTH(
END ) <= MONTH(
END ) , YEAR( NOW( ) ) +1, YEAR( NOW( ) ) ) , "-", MONTH(
END ) , "-", DAY(
END ) ) AS DATE ) AS
END
FROM pm_parking_type
HAVING '2011-11-28'
BETWEEN START AND END LIMIT 1

MySQL meldet: Dokumentation
#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 'CAST(CONCAT(YEAR(NOW()), &quot;-&quot;, MONTH(start), &quot;-&quot;, DAY(start)) AS DATE) AS start,
' at line 2
 
Wenn das oben die Originalabfrage ist, hast du sie auch falsch abgeschrieben. Nach dem "*" fehlt das Komma!
 
Im phpmyadmin funktioniert das einwandfrei.

Im PHP Code nicht

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 '0' at line 1

PHP:
$query = mysql_query("SELECT *,
CAST(CONCAT(YEAR(NOW()), "-", MONTH(start), "-", DAY(start)) AS DATE) AS start,
CAST(CONCAT(IF(MONTH(end) <= MONTH(end), YEAR(NOW())+1, YEAR(NOW())), "-", MONTH(end), "-", DAY(end)) AS DATE) AS end
FROM pm_parking_type HAVING '2011-11-28' BETWEEN start AND end LIMIT 1") or die(mysql_error());
 
Wie lange arbeitest du den schon mit PHP und mySQL?

Du kannst nicht eine SQL Anweisung in doppelte Anführungszeichen packen und darin doppelte Anführungszeichen verwenden!
 
Davon war auch nie die Rede das du für die Ermittlung des aktuell gültigen Preis ein Datum nimmst welches in der Zukunft liegt. Ist für mich auch irgendwie unlogisch.

In diesem Fall musst du mit PHP Mitteln das Jahr aus dem übergebenen Datum auslesen und in die Abfrage einbauen.
 
Hallo,

es gibt noch ein Problem.. wenn es zwei zeiträume gibt z.B. 1.4 - 1.8 und 2.8-31.3 dann gibt es ja insegesamt eigentlich 3. z.B.
02.08.2010 - 31.03.2011
01.04.2011 - 01.08.2011
02.08.2011 - 31.03.2012

aktuell wird nur der 2 & 3 erkannt der 1. wird nicht gefunden... man müsste das noch ergänzen, habe es schon mal probiert.. Leider klappt das Having nicht..

SQL:
SELECT *,
	CAST(CONCAT(".$year.",  \"-\", MONTH(start), \"-\", DAY(start)) AS DATE) AS start,
	CAST(CONCAT(IF(MONTH(end) <= MONTH(start), ".($year+1).", ".$year."), \"-\", MONTH(end), \"-\", DAY(end)) AS DATE) AS end,
	IF(MONTH(end) <= MONTH(start), 
	\"CAST(CONCAT(".$year.",  \"-\", MONTH(start), \"-\", DAY(start)) AS DATE) AS start1,
	CAST(CONCAT(".($year-1).", \"-\", MONTH(end), \"-\", DAY(end)) AS DATE) AS end1\"
	, '')
	FROM pm_parking_type WHERE parking_id='".$parking_id."' HAVING '".date('Y-m-d',$flight_out)."' BETWEEN (start AND end) or BETWEEN (start2 AND end2) LIMIT 1
 
Zurück