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