![]() |
Datenbank: PostgreSQL • Version: 8,.4 • Zugriff über: UniDAC
'24:00' Uhr als Parameter an Query übergeben
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:
Die Parameter belegen wir dann folgendermaßen:
SELECT * FROM tabelle WHERE uhrzeit BETWEEN cast(:anfang AS time) AND cast(:ende AS time)
Code:
Sobald die Query jedoch geöffnet wird, wird ein EConvertError ausgelöst der besagt:
Query.ParamByName('anfang').AsString := '18:00';
Query.ParamByName('ende').AsString := '24:00'; "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. |
AW: '24:00' Uhr als Parameter an Query übergeben
Landet auch 24:00 in der Datenbank? Bei MySQL war es so, dass 24:00 Uhr eigentlich 00:00 Uhr ist und der Zeit-Datentyp demzufolge nur von 0:00 - 23:59:59 geht ... Geht es wenn Du aus "24:00" eine "0:00" machst? Kannst Du nicht die
![]() Also ich frage mich gerade nur, wie das dann intern auseinandergehalten werden soll von PostgreSQL... Viele Grüße |
AW: '24:00' Uhr als Parameter an Query übergeben
Also wie das intern auseinander gehalten wird von Postgres weiß ich leider nicht, aber Fakt ist, es geht! Wenn in der Tabelle ein Zeitraum abgespeichert wird, der von 18 - 24 Uhr geht, dann steht auch 24 Uhr in der Tabelle! Wenn Postgres daraus 0 Uhr machen würde, dann wäre das beispielsweise für meine genannte Abfrage fatal:
Code:
liefert bei Postgres nämlich "True" zurück...
select cast('19:00' as time) between cast('18:00' as time) and cast('24:00' as time)
Code:
logischerweise "False", da der Zeitraum von 0 - 18 Uhr betrachtet wird.
select cast('19:00' as time) between cast('18:00' as time) and cast('00:00' as time)
StrToTime bringt mir da leider überhaupt nichts, weil die Funktion sicherlich denselben EConvertError erzeugen dürfte, sollte man ihr "24:00" übergeben. |
AW: '24:00' Uhr als Parameter an Query übergeben
Hm, Versuch das ganze mal als Integer zu übergeben. Also
Delphi-Quellcode:
Kann Postgre laut Doku auch mit umgehen
.AsInteger := 180000;
.AsInteger := 240000; |
AW: '24:00' Uhr als Parameter an Query übergeben
Muss ich leider verneinen...
Code:
FEHLER: kann Typ integer nicht in Typ time without time zone umwandeln
LINE 1: select cast('19:00' as time) between cast(180000 as time) an... |
AW: '24:00' Uhr als Parameter an Query übergeben
Zitat:
Code:
Das legt fest, dass der Parameter als Time interpretiert werden soll (muss).
cast(:ende AS time)
Wenn du abfragen möchtest, was in der Zeit von 18-0 Uhr gewesen ist und es bei anderen Abfragen keine Überschneidungen geben soll, dann müsste die Abfrage ja eigentlich lauten
Code:
BETWEEN fragt aber so ab
00:00 <= Zeit < 09:00
09:00 <= Zeit < 18:00 18:00<= Zeit < 24:00
Code:
Somit würden alle Einträge auf den Zeitgrenzen in den Abfragen quasi doppelt erscheinen.
00:00 <= Zeit <= 09:00
09:00 <= Zeit <= 18:00 18:00<= Zeit <= 24:00 Besser (und damit stressfreier) wäre es mit BETWEEN die Stunde abzufragen
Code:
0 <= Stunde( Zeit ) <= 8
9 <= Stunde( Zeit ) <= 17 18 <= Stunde( Zeit ) <= 23 |
AW: '24:00' Uhr als Parameter an Query übergeben
Zitat:
|
AW: '24:00' Uhr als Parameter an Query übergeben
|
AW: '24:00' Uhr als Parameter an Query übergeben
Zitat:
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz