MySQL: Schachtelung von SQL-Funktionen klappt nicht...
AndreD
- datenbank
Hallo zusammen,
Ist ein wenig tricky, deshalb auch die ausführliche Erklärung, ich hoffe mal es ist einigermassen verständlich geschrieben. Anmerkung: Anstatt des Datums stehen normalerweise die Variablen im Statement macht aber im Endeffekt keinen Unterschied.
-> Problem:
In Eingabefelder wird ein Datum von - bis in der Form 01.05.2003 eingeben. Dies wird in das untenstehende Select-Statement geschrieben um die Ausgabe auf dieses Datum einzugrenzen. Die Felder in der Datenbank sind als DATETIME angelegt. Die Query funktioniert soweit auch, ich ich kann auch mit:
...timestamp>='DATE_FORMAT(05.05.2003, d.m.Y)'... (= von-Datum)
es in diesem Fall umwandeln, leider geht es hier:
...timestamp<='DATE_ADD(DATE_FORMAT(05.05.2003, d.m.Y), INTERVAL 1 DAY)'... (= bis-Datum) nicht.
Offensichtlich liegt es daran das ich 2 SQL-Funktionen ineinander verschachtele und diese wahrscheinlich nicht aufgelöst werden können?
Ich habe die Schachtelung leider ohne Erfolg auf diese Arten versucht:
SELECT pdf_id, COUNT(pdf_id) AS anzahl, dateiname, beschreibung,
md5 FROM download INNER JOIN pdf ON pdf_id=id WHERE kunde_id='1' AND
timestamp>='DATE_FORMAT(05.05.2003, d.m.Y)' AND timestamp<='DATE_ADD(DATE_FORMAT(05.05.2003, d.m.Y), INTERVAL 1 DAY)' GROUP BY pdf_id;
SELECT pdf_id, COUNT(pdf_id) AS anzahl, dateiname, beschreibung,
md5 FROM download INNER JOIN pdf ON pdf_id=id WHERE kunde_id='1' AND
timestamp>='DATE_FORMAT(05.05.2003, d.m.Y)' AND timestamp<='DATE_FORMAT(DATE_ADD(05.05.2003, INTERVAL 1 DAY), d.m.Y)' GROUP BY pdf_id;
->Zur Erklärung:
Die Funktion DATE_ADD welche einen Tag hinzurechnet ist nötig, da DATETIME ja eigentlich aus YYYY-MM-TT--HH-MM-SS besteht und sobald eine Sekunde vom Tag z.B. 2003-05-05 vergangen ist, dieser ja grösser als der gesuchte String ist und somit nicht mehr angezeigt wird. Ich würde auch gerne nur ein DATE-Feld verwenden, leider kann es sein das der Auftraggeber auch noch zusätzlich irgendwann vielleicht die Suche z.B. stundenweise einschränken möchte.
->Frage:
Weiss jemand was in der obrigen Schachtelung falsch ist, oder weiss jemand sicher das man 2 Funktionen so nicht schachteln kann?
->Alternative:
Wäre vielleicht das man die Zeit in einen Unix-Timestamp umrechnet und damit arbeitet. Ich hoffe aber das man das irgendwie schon im SQL-Statement lösen kann da es einfach weniger Code braucht und in meinen Augen auf jeden Fall schneller sein sollte.
Wäre schön wenn jemand ein paar Anregungen für mich hätte!
Gruss aus Heilbronn (bei Stuttgart)
AndreD
Hallo!
...timestamp>='DATE_FORMAT(05.05.2003, d.m.Y)'... (= von-Datum)
es in diesem Fall umwandeln, leider geht es hier:
...timestamp<='DATE_ADD(DATE_FORMAT(05.05.2003, d.m.Y), INTERVAL 1 DAY)'... (= bis-Datum) nicht.
Da sind ein paar Syntaxfehler in Deinem SQL-Statment:
mysql> SELECT DATE_ADD(DATE_FORMAT('2003-05-05', '%Y-%m-%d'), INTERVAL 1 DAY) AS test;
+------------+
| test |
+------------+
| 2003-05-06 |
+------------+
1 row in set (0.00 sec)
Nicht 05.05.2003 sondern '2002-05-05'.
Nicht d.m.Y, sonder '%Y-%m-%d'.
Aber DAT_FORMAT ist überflüßig:
mysql> select DATE_ADD('2003-05-05', INTERVAL 1 DAY) AS test;
+------------+
| test |
+------------+
| 2003-05-06 |
+------------+
1 row in set (0.00 sec)
MfG, André Laugks
Hi André,
Da sind ein paar Syntaxfehler in Deinem SQL-Statment:
Da hast Du allerdings recht, ist wohl zum Teil das Ergebnis vom testen :-)
Nicht 05.05.2003 sondern '2002-05-05'.
Ja, ich habs auch erst 2003-05-05 geschrieben,aber das Ziel sollte ja sein das SQL auch einen String in der Form von 05.05.2003 annimmt.
Nicht d.m.Y, sonder '%Y-%m-%d'.
Das hatte ich auch testweise so verändert, in der Hoffnung man kann sich so selber die Datumsformatierung bestimmen, also SQL sagen wie die Daten aussehen damit SQL diese selbst ins richtige interne Format wandelt.
Aber DAT_FORMAT ist überflüßig:
Nicht wenn die Daten in der Form 05.05.2003 ins Query reingeschrieben werden? Darum gehts mir ja, ich würde gerne die Formatierung innerhalb des Statements vornehmen, als ich 05.05.2003 in die DATE_FORMAT eingelesen habe ging es ja, nur wenn aussen (oder innen) noch die zweite Funktion DATE_ADD steht gehts nicht mehr.
Muss ich wohl mein eingegebenes Datum per reg. Expressions in das entsprechende SQL-Format wandeln und dieses dann in das Query einfügen? Das sollte zur Not auch gehen, vielleicht hat jemand eine bessere Idee?
Danke mal & Gruss auf Heilbronn,
AndreD
MfG, André Laugks
Hallo,
ich lasse es, ich denk mal das man in MySQL nicht so ohne weiteres Funktionen derart schachteln kann. Ich habs jetzt mit einer Klasse gelöst die das Datum MySQL-konform umwandelt.
Trotzdem danke für die Anregungen!
Gruss AndreD
Hallo!
ich lasse es, ich denk mal das man in MySQL nicht so ohne weiteres Funktionen derart schachteln kann. Ich habs jetzt mit einer Klasse gelöst die das Datum MySQL-konform umwandelt.
Doch, setze sie richtig ein! Ich glaube das ist Dir noch nicht ganz klar, wo und wie man Funktionen einsetzt, bzw. was sie für Werte erwarten.
MfG, André Laugks
Hallo!
Nicht 05.05.2003 sondern '2002-05-05'.
Ja, ich habs auch erst 2003-05-05 geschrieben,aber das Ziel sollte ja sein das SQL auch einen String in der Form von 05.05.2003 annimmt.
DATE_ADD() erwartet aber ein Datum oder Datum und Zeit in der Form YYYY-MM-DD bzw. YYYY-MM-DD HH:MM:SS.
Nicht d.m.Y, sonder '%Y-%m-%d'.
Das hatte ich auch testweise so verändert, in der Hoffnung man kann sich so selber die Datumsformatierung bestimmen, also SQL sagen wie die Daten aussehen damit SQL diese selbst ins richtige interne Format wandelt.
Erstens, es kommt auch auf das %-Zeichen an. MySQL benötig die Formate, wie oben beschrieben, um rechnen zu können. Da könnte ja jeder kommen und irgendwie das Datum zum berechnen formatieren.
Aber DAT_FORMAT ist überflüßig:
Nicht wenn die Daten in der Form 05.05.2003 ins Query reingeschrieben werden? Darum gehts mir ja, ich würde gerne die Formatierung innerhalb des Statements vornehmen, als ich 05.05.2003 in die DATE_FORMAT eingelesen habe ging es ja, nur wenn aussen (oder innen) noch die zweite Funktion DATE_ADD steht gehts nicht mehr.
Wenn Du das Datum formatieren möchtest, kannst Du das tun. Im WHERE-Bereich wird es Dir aber nichts bringen, da kommt es ja zu keiner ausgabe. Dort werden nur Bedingungen hin geschrieben.
SELECT DATE_FORMAT('2003-05-05', '%d.%m.%y') AS format_datum WHERE ... DATE_ADD('2003-05-01', INTERVAL 1 DAY);
Muss ich wohl mein eingegebenes Datum per reg. Expressions in das entsprechende SQL-Format wandeln und dieses dann in das Query einfügen? Das sollte zur Not auch gehen, vielleicht hat jemand eine bessere Idee?
Nööö, auf keinen Fall. Nur die Funktionen an der richtigen Stelle einsetzen.
MfG, André Laugks