Einzelnen Beitrag anzeigen

MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#1

'24:00' Uhr als Parameter an Query übergeben

  Alt 8. Okt 2010, 09:29
Datenbank: PostgreSQL • Version: 8,.4 • Zugriff über: UniDAC
Wir verwenden die UniDAC-Komponenten, um auf eine PostgreSQL-Datenbank zuzugreifen. In der Datenbank existieren verschiedene Tabellen, in die Uhrzeiten eingetragen werden (Datentyp: time without time zone). Es handelt sich immer um Anfangs- und Endzeiten, wobei die Endzeiten auch den Wert '24:00' Uhr annehmen können. PostgreSQL unterscheidet 0 Uhr und 24 Uhr voneinander, ich weiß nicht, wie es sich da bei anderen DBMS verhält. Bei Delphi gehört 24 Uhr ja quasi schon zum nächsten Tag, da der Nachkommawert eines TDateTime dann wieder voll ist. Daher kann 24 Uhr auch nicht als TDateTime-Parameter übergeben werden.

Aus diesem Grund übergeben wir time-Werte bei Abfragen immer als string-Parameter an die Query und casten den string innerhalb des SQL-Statement auf einen time-Wert. Also z.B. in der Form:

Code:
SELECT * FROM tabelle WHERE uhrzeit BETWEEN cast(:anfang AS time) AND cast(:ende AS time)
Die Parameter belegen wir dann folgendermaßen:

Code:
Query.ParamByName('anfang').AsString := '18:00';
Query.ParamByName('ende').AsString := '24:00';
Sobald die Query jedoch geöffnet wird, wird ein EConvertError ausgelöst der besagt:

"Hour is out of range."

Was ich mich an der Stelle frage, ist, an was die Query hier festmacht, dass der übergebene Parameter einen Zeittyp darstellt, ich übergebe ihn ja explizit als string. Ich hab auch schon versucht, den FieldType der Parameter hart auf ftString zu setzen, hat aber nichts gebracht.

Was ich halt auch nicht weiß, ob das eine "Spezialität" der UniDAC-Komponenten ist, oder ob das Verhalten von einer Delphi-Basisklasse wie dem TDataSet geerbt wurde und sich somit alle Query so verhalten.

Wie kann ich das Beheben, ohne auf die Verwendung von Parametern verzichten zu müssen? Wenn ich die "24:00" hart in das SQL-Statement reinschreibe, dann klappt der Aufruf nämlich.

Geändert von MatthiasR ( 8. Okt 2010 um 09:32 Uhr)
  Mit Zitat antworten Zitat