Entwickler-Ecke

Datenbanken - Fehler in WHERE Bedingung


butterkeks - Mo 15.11.10 16:37
Titel: Fehler in WHERE Bedingung
Hallo,

ich habe das Problem das ich den Fehler

Unknown Column 'Datum' in 'Where clause'

angezeigt bekomme wenn ich die abfrage


SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
SELECT Schmuck.snummer, Schmuck.ver_preis, Schmuck.lieferant, Kassenbericht.Datum
FROM Schmuck, Kassenbericht
WHERE STR_TO_DATE( Kassenbericht.Datum, "%d.%m.%Y" ) 
BETWEEN STR_TO_DATE( "01.03.2009""%d.%m.%Y" ) 
AND STR_TO_DATE( "31.03.2009""%d.%m.%Y" ) 
AND Schmuck.snummer = Kassenbericht.snummer
ORDER BY Kassenbericht.id


ausführe.

Die Spalten sind alle in den entsprechenden Tabellen vorhanden und es dürfte eigentlich keine Probleme geben, was man halt auch daran merkt das die abfrage von PHPMYADMIN fehlerfrei durchläuft.

Das komische dabei ist, das ich diese abfrage ohne Fehler in PHPMYADMIN ausführen kann, aus meiner in Delphi geschriebenen Anwendung heraus aber immer den Fehler ausgegeben bekomme.

Ich benutze die komponenten TSQLconnection und TSQLQuery.

Weiss jemand wie man das hinbekommen kann?

Moderiert von user profile iconMartok: SQL-Tags eingefügt


jaenicke - Mo 15.11.10 17:11

Geht es denn ohne die where Bedingung? Also wird die Spalte denn überhaupt gefunden?

Ich schau sonst nachher einmal.


butterkeks - Mo 15.11.10 17:27

Es SCHEINT zu gehen...ich kann es nur nicht zu ende testen, da ohne die Datumseinschränkung auf meinem System hier ein Durchlauf eine Stunde dauert^^

Er wirft auf jeden Fall nicht wie vorher direkt als erstes die Fehlermeldung aus.

Und das er die Spalte nicht findet kann eigentlich auch nicht sein, weil ich die Spalte mit einem "SELECT Datum FROM Kassenbericht" anzeigen lassen kann. Das muss irgendwie an dieser speziellen Abfrage hängen.


Sinspin - Mo 15.11.10 17:42

Was ist STR_TO_DATE? Ist das eine Funktion von PHP oder der Datenbank?
Wenn ich mir das allgemein anschaue, ist die Clausel für einen Datumsrange doch eigentlich

SQL-Anweisung
1:
Datumsfeld BETWEEN "2010-01-01" AND "2010-12-31"                    


In deinem Fall wäre das dann doch sicher eher so?

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
SELECT Schmuck.snummer, Schmuck.ver_preis, Schmuck.lieferant, Kassenbericht.Datum
FROM Schmuck, Kassenbericht
WHERE Kassenbericht.Datum
BETWEEN "2009-03-01"
AND "2009-03-31"
AND Schmuck.snummer = Kassenbericht.snummer
ORDER BY Kassenbericht.id


butterkeks - Mo 15.11.10 18:11

STR_TO_DATE ist eine MySql funktion.

Und diese muss enthalten sein weil das Datum als Varchar abgelegt wird und daher das Between sonst nicht richtig funktioniert.


haentschman - Mo 15.11.10 21:00

[OT]
Zitat:
Datum als Varchar abgelegt

wenns irgenwie machbar ist solltest du das ändern... oder dem DB Admin auf die Finger klopfen.
[/OT]


butterkeks - Mo 15.11.10 23:43

Ich weiss^^ aber geht im Moment nicht anders.

Aber es funktioniert ja per Datumsformatierung...ist halt nur die frage warum das in diesem Fall nicht geht.


jaenicke - Di 16.11.10 06:55

Ich habe gerade kurz gesucht und einen entsprechenden Bugreport gefunden:
http://bugs.mysql.com/bug.php?id=6310
Andere haben also wohl das selbe Problem. Und wenn du bei between direkt die Strings angibst und nur bei der Spalte selbst STR_TO_DATE benutzt?


butterkeks - Do 18.11.10 13:11

Jetzt konnte ich endlich die Möglichkeiten durchtesten.
Aber ich hab immer das gleiche Problem, er gibt die selbe Fehlermeldung aus.

Gibt es denn keine Möglichkeit das irgendwie hin zu bekommen?


Burgwart - Do 18.11.10 16:54

Hallo!

Also bei mir geht das so! Ich hoffe es hilft.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
  SQL.Close;
  SQL.SQL.Clear;
  s := 'select b.aus,a.rechnungsdatum,c.anzahl,b.preis,d.artikelname,e.nachname,e.firma,';
  s := s + 'e.land,b.id from rechnung a,rechnung_t b,auftrag_t c,artikel d,kunde e where a.id=b.rechnung_id and ';
  s := s + 'a.kunde_id=e.id and (a.storniert=0 or isnull(a.storniert)) and b.auftragt_id=c.id and ';
  s := s + 'c.artikel_id=d.id and d.artikelname like :p1 and a.rechnungsdatum >= :p2 and ';
  s := s + 'a.rechnungsdatum <= :p3 and e.land like :p4 order by 2';
  SQL.SQL.Append(s);
  s1 := DateFormat(datetostr(d_begin.value));
  s2 := DateFormat(datetostr(d_end.value));
  SQL.ParamByName('p1').AsString := '%' + aname.Text + '%';
  SQL.ParamByName('p2').AsString := s1;
  SQL.ParamByName('p3').AsString := s2;
  SQL.ParamByName('p4').AsString := '%' + land.Text + '%';
  SQL.Open;


Function TForm32.DateFormat(date : String): string;
var
 rechnungsdatum,m,d,y,s : string;
 begin
  s := date;
  d := Copy(s,1,Pos('.',s)-1);
  Delete(s,1,Pos('.',s));
  m := Copy(s,1,Pos('.',s)-1);
  Delete(s,1,Pos('.',s));
  y := Copy(s,1,Length(s));
  rechnungsdatum := y+'-'+m+'-'+d;
  result := rechnungsdatum;
end;

Datum im Edit.Text := '18.11.2010';


Gruß Burgwart

Moderiert von user profile iconMartok: Delphi-Tags gesetzt


butterkeks - Mo 22.11.10 17:21

Hmm nee, auch mit deiner Schreibweise gibt's den selben Fehler...er weiß immer nicht das es eine Spalte gibt die er normalerweise haben müsste -.-

Ich versteh nicht was da falsch laufen kann...

Es ist, als ob er keine Join's kann...