Autor Beitrag
flaavia
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: Fr 07.11.03 16:23 
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:

ausblenden 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.

ausblenden 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


Zuletzt bearbeitet von flaavia am Fr 07.11.03 21:28, insgesamt 1-mal bearbeitet
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Fr 07.11.03 21:35 
oder
select * from table where datum > convert(DATETIME,'<hier datum>',102)

grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
flaavia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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]);
  ...

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
flaavia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: 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,

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
flaavia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)