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.