Entwickler-Ecke

Datenbanken - SQL-Abfrage mit Datum z.B. 07.11.2003 anstatt mit TDateTime


flaavia - Fr 07.11.03 16:23
Titel: SQL-Abfrage mit Datum z.B. 07.11.2003 anstatt mit TDateTime
Hallo


Ich versuche in meiner Datenbank (Access über ADOQuery) nur bestimmte Datensätze auszufiltern, die z.B. älter sind, als ein bestimmes Datum ist. Es funktioniert mit:


Quelltext
1:
select * from Tabelle where Datumspalte > 37680                    


wenn das Datum in TDateTime, also 37680 (als Beispiel) angegeben wird.

Da meine Datumsangaben in der Tabelle aber im "normalen" Format aufgeführt werden, würde ich gern ein "normales" Datum in der SQL-Anweisung angeben also z.B.


Quelltext
1:
select * from Tabelle where Datumspalte > 28.02.2003 00:03:23                    


Geht das? bzw. wie muss man das in der SQL-Anweisung machen, damit die Datumsumwandlung funktioniert??


Für alle Tips bin ich sehr dankbar :D

Mit freundlichen Grüssen


UGrohne - Fr 07.11.03 20:24

Versuch mal die Datumswerte in Anführungszeichen zu setzen, weiß aber nicht genau, ob das danna uch mit angehängter Zeit funktioniert. Evtl. musst Du sie aber auch dann etwas umformatieren


MSCH - Fr 07.11.03 21:35

oder
select * from table where datum > convert(DATETIME,'<hier datum>',102)

grez
msch


flaavia - Fr 07.11.03 21:48

Hallo

Leider geht es auch mit Anführungszeichen nicht, weder mit noch ohne angehängte Zeit. :?

Die Fehlermeldung lautet dann:

Datentypen in Kriterienausdruck unverträglich

Gibt es noch eine andere Lösung??

Ich könnte natürlich die DB umbauen und das Datum in einer weiteren Spalte im DateTime-Format mitführen, aber eigentlich sollte das doch auch irgendwie anders gehen - es werden doch auch sicherlich auch viele andere Programierer Datenbanken nach Zeiten ordnen wollen, so dass es da doch was geben müsste


flaavia - Fr 07.11.03 22:01

Hallo Msch

Habe meine letzt Antwort geschrieben bevor ich Deinen Beitrag gesehen hatte

Ich verstehe Deinen Vorschlag leider nicht ganz.

Ich habe das Datum in der DB in folgendem Format stehen:

07.11.2003 20:45:00

und würde bei meinen SQL-Anweisungen ein Datum eingeben wollen (die Zeiten sind ehr unwichtig), ab dem die Daten ausgewählt werden. Zu diesem Datum weiss ich (oder der Benutzer) die entsprechende Zahl im TDateTime-Format nicht (kann man natürlich errechnen, ist aber ehr unanschaulich und mit zusätzlichem Aufwand verbunden, der eigentlich nicht zu dem Program passt)

kann ich dann nach deinem Vorschlag schreiben:


Quelltext
1:
select * from table where datum > convert(DATETIME,'28.02.2003 00:03:23',102)                    



aber was soll die 102 nach dem Komma?

ich habe es gerade ausprobiertund bekomme die Fehlermeldung:

Undefinierte Funktion 'convert' in Ausdruck

Was habe ich falsch gemacht?


smiegel - Sa 08.11.03 08:44

Hallo,

Access will das Datum in der Form MM/TT/JJJJ. Dies bedeutet, Du musst Deinen Datumsstring entsprechend umwandeln:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function MakeAccessDatum(const aDate:TDateTime):String;
var t, m, j:Word;
begin
  DecodeDate(aDate, j, m, t);
  Result:=Format('%0.2d/%0.2d/%d', [m, t, j]);
end// MakeAccessDatum


Aufrufen kannst Du es dann folgendermaßen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  var sDat:String;
  ...
  ...
  sDat:=MakeAccessDatum(EncodeDate(2003118));
  ...
  MyQuery.Text:=
    Format('SELECT * FROM table WHERE datum>#%s#', [sDat]);
  ...


flaavia - Sa 08.11.03 10:09

@ smiegel

Vielen Dank für den Tip

Wenn ich mir die Access DB direkt unter Access ansehe, dann sind dort die Datumsdaten allerdings in dem "normalen" Format

28.02.2003 00:03:23

aufgeführt. Da ich die in den ersten postings genannten Abfragen durchführen kann, wenn ich das Datum einfach im TDateTime, also als Zahl (Double) angebe,


Quelltext
1:
select * from Tabelle where Datumspalte > 37680.459854                    


habe ich den Eindruck, dass das Datum intern auch in diesem Format abgespeichert wird, und dann je nach unter den Access-Formatierungseinstellungen eingestellt, dargestellt wird.

Ich habe Deinen Vorschlag, das Datum in diesem Format mm/tt/jjjj anzugeben, direkt im SQL-Text ausprobiert


Quelltext
1:
select * from Tabelle where Datumspalte > 08/28/2003                    


- und es kommt keine Fehlermeldung mehr -

leider wird aber auch die Anweisung nicht ausgeführt, d.h. auch Datensätze mit älterem Datum, als dem im SQL-String angegebenen, mit dargestellt :?: :?:


smiegel - Sa 08.11.03 14:14

Hallo,

wenn Du das Datum als Text übergeben willst, muss es zwischen 2 Rauten stehen (#11/08/2003#). Dies habe ich auch in meinem Posting so angegeben.

Definiere Dir einmal eine entsprechende Abfrage im Abfrageeditor von Access und schau Dir dann einmal den SQL-Code an...

Sicherlich kannst Du das Datum als TDateTime-Wert übergeben, da auch Access das Datum als seriellen Wert speichert. Aber ich würde mich nicht darauf verlassen, dass das Delphi- und das Accessdatum hunderprozentig kompatibel zueinander sind.


flaavia - Sa 08.11.03 15:14

Vielen herzlichen Dank

Das mit den Rauten hatte ich übersehen :idea: . Jetzt geht es :D , wenn wohl auch mit kleinen Rundungsfehlern (bei > #11/02/2003# wird z.B. ein Datensatz mit 02.11.2003 23:53:19 noch angezeigt, aber das ist nicht ganz so wichtig.

Jedenfalls vielen herzlichen Dank für die Unterstützung :!:

PS: sind wohl doch keine Rundungsfehler, sondern wenn keine Zeit angegeben wird, wird diese wohl automatisch 00:00:00 gesetzt. Wie müsste ich denn die Zeit mit angeben?

#11/02/2003 23:53:19# :?:


smiegel - Sa 08.11.03 15:41

Hallo,

flaavia hat folgendes geschrieben:

#11/02/2003 23:53:19#


genau so.

Das mit der Vermutung, dass ein Datum ohne Uhrzeitangabe immer 0 Uhr ist, stimmt auch.