Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Postgres: interval als ParamByName (https://www.delphipraxis.net/210092-postgres-interval-als-parambyname.html)

Incocnito 28. Feb 2022 13:38

Datenbank: postgres • Version: 10.4 • Zugriff über: MyDac

Postgres: interval als ParamByName
 
Moin zusammen.

Ich brauche mal einen kurzen Tipp:
Wenn ich eine SQL-Abfrage mit Werten fülle nutze ich eigendlich immer ParamByName.
Bei dem Wert hinter "interval" klappt das aber nicht.

Delphi-Quellcode:
Query.SQL.Text := 'SELECT * FROM Tab1 WHERE (status = :iStatus) AND (ts_create <= (current_timestamp + interval ''-1 days''))';
Query.ParamByName('iStatus').AsInteger := MY_FUNNY_STATE{2};
funktioniert, aber

Delphi-Quellcode:
Query.SQL.Text := 'SELECT * FROM Tab1 WHERE (status = :iStatus) AND (ts_create <= (current_timestamp + interval :sInterval))';
Query.ParamByName('iStatus').AsInteger := MY_FUNNY_STATE{2};
Query.ParamByName('sInterval').AsString := '-1 days';
geht nicht.

Ist jetzt nicht die richtige SQL, aber man sieht worauf ich hinaus will.
Ich hoffe da hat sich jetzt kein Tippfehler eingeschlichen, der einen auf eine falsche Spur lockt.
Was ist der Trick bei Postgres-interval?

Liebe Grüße
Incocnito

jobo 28. Feb 2022 15:37

AW: Postgres: interval als ParamByName
 
Ich konnte mich noch nie mit dieser seltsamen Notation von Zeit/Datumswerten. Aber vielleicht ist es sogar ein ANSI Standard.

Interessant wäre, welche Fehlermeldung Du bekommst.

Ansonsten nur geraten, versuch mal:
Code:
Query.SQL.Text := 'SELECT * FROM Tab1 WHERE (status = :iStatus) AND (ts_create <= (current_timestamp + :sInterval::interval))';
::interval ist dabei eine Typangabe. Die genauso im finalen SQL erscheint/erscheinen muss.

Ausgewertet also auf PG-Seite:
Code:
Query.SQL.Text := 'SELECT * FROM Tab1 WHERE (status = <irgendeinStatusWert>) AND (ts_create <= (current_timestamp + '1 days'::interval))';
Mglw. kollidiert das wiederum mit der Parameter Handhabung von Delphi, da bin ich etwas raus. Das kann man glaub ich irgendwie umgehen / variieren.

Incocnito 28. Feb 2022 16:09

AW: Postgres: interval als ParamByName
 
Moin!

An die Typkonvertierung hatte ich gar nicht mehr gedacht!
Das läuft wie nix gutes! Besten Dank!

Liebe Grüße
Incocnito

jobo 28. Feb 2022 17:04

AW: Postgres: interval als ParamByName
 
Prima.

Als Ergänzung:
Solange man nur Tage zu einem Datum(sTyp) addieren will, geht auch:
<meinDatumsWert> + <Tag>
Date + Integer
myDate + :intParam

Das finde ich ziemlich intuitiv, leider ist diese Operation nur für Date plus Integer, nicht für DateTime Werte + Integer definiert. Und auch nicht für Zeitanteile eines Tages.

eine andere Variante ist:
<meinTimestampWert> + Interval('1 days') * :intParam
usw.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz