Entwickler-Ecke

Datenbanken - Datumsvergleich mit Sql Abfrage


cyberax - Fr 20.01.06 21:55
Titel: Datumsvergleich mit Sql Abfrage
Hallo, ich möchte mit einer SQL Abfrage aus einer Tabelle alle Zeile zurückgeliefert haben, in der der bestimmte wert - in meinem Fall "Lieferdatum" - < ist als das heutige DAtum.

So sieht meine Abfrage aus:

Delphi-Quelltext
1:
 sql.text:= 'Select * from LIEFERSCHEINDB where lieferdatum < '+quotedstr(heute);                    


Nun wird aber nur der Tag richtig ausgewertet, dass heißt für die Abfrage ist der 15.02.2006 immer noch kleiner als der 18.01.2006. Wie kann ich das mit dem Datumsvergleich realisieren?

MFG DV


mkinzler - Fr 20.01.06 22:00

Was für ein Feldtyp hat lieferdatum ?
Wenn das Feld nicht vom Typ Date/DateTime o.aä. ist dann hilft vielleich ein CAST.


cyberax - Fr 20.01.06 22:31

Der Feldtyp ist varchar.

Wie würde die Anweisung dann aussehen? Kenne das Cast nicht!?!?


mkinzler - Fr 20.01.06 22:38

Ich hab mir schon gedacht, das der Feldtyp nicht Date ist. Denn die Sortierung ist bei Strings von links nach rechts, d.h. 18 ist nunmal größer als 15.

Select * from LIEFERSCHEINDB where cast(lieferdatum as date) < '+quotedstr(heute);

Wenn es möglich ist würde ich aber den Feldtyp von varchar auf date ändern.


cyberax - Mo 23.01.06 19:24

Leider funktioniert das mit CAST genauso, wie ohne. Kann das daran liegen, dass ich noch mit Mysql 4.0.12 arbeite??

Ich habe auch versucht den Feldtyp von varchar auf date zu stellen, aber ich weis nicht genau, wie ich dann die SQL Abfrage formulieren soll?!??


mkinzler - Mo 23.01.06 20:03

user profile iconcyberax hat folgendes geschrieben:
Leider funktioniert das mit CAST genauso, wie ohne. Kann das daran liegen, dass ich noch mit Mysql 4.0.12 arbeite??

Ich habe auch versucht den Feldtyp von varchar auf date zu stellen, aber ich weis nicht genau, wie ich dann die SQL Abfrage formulieren soll?!??


Exportiere die Tabelle in eine SQL-Skript (Metadaten + Daten), Tabelle löschen, im Skript Feldtyp ändern und Skript ausführen.

Oder


SQL-Anweisung
1:
Alter table LIEFERSCHEINB alter lieferdatum type date                    


cyberax - So 29.01.06 21:12

Also, der Feld - Typ der Tabelle ist von varchar auf date umgestellt. Aber das ganze funktioniert leider nicht richtig.


Delphi-Quelltext
1:
   sql.text:='SELECT * from lieferschein where cast(liefertermin as date) <'+quotedstr(jetzt);                    


Sorum werden gar keine Ergebnisse zurückgeliefert und wenn das '<' anders herum dasteht, dann werden auch die Einträge zurückgeliefert, wo liefertermin kleiner ist als das Datum heute (jetzt).

?!?

Ist doch eigentlich keine schwere Sache, aber wieso funktioniert das nicht?
Was bewirkt das Cast?


mkinzler - So 29.01.06 21:15

Wenn der Feldtyp schon Date ist kannst du das cast weglassen. Das cast bewirkt eine Typkonvertierung.


cyberax - Mo 30.01.06 22:59

Okay. Also auch ohne Cast funktioniert das so nicht. Habe das Problem nun ganz anders gelöst, indem ich noch einen Eintrag in die Tabelle schreibe, woran ich erkenne ob das Datum größer oder kleiner als heute ist.

Trotzdem vielen Dank für die Hilfe!