PDA

View Full Version : Datum im ISO8601 Format



Seiten : [1] 2

pabloesco
26-08-21, 08:44
Hallo Forum,

Gibt es eine Funktion womit ich ein Datum in das ISO8601 Format konvertieren lässt. Ich habe dazu bisher leider noch nichts gefunden.


2020-06-12T09:50:01.001Z

Vielen Dank!

Fuerchau
26-08-21, 08:47
Guckst du hier:
https://www.ibm.com/support/producthub/db2/docs/content/SSEPGG_11.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007107.html

B.Hauser
26-08-21, 09:25
TIMESTAMP_FORMAT wird an dieser Stelle wohl nicht viel helfen! Die Funktion wird verwendet um eine alphanumerische Darstellung eines Datums, einer Zeit oder einer Zeitmarke in eine echte Zeitmarke zu konvertieren.

Für die Aufbereitung eines Datums- oder Zeitwertes ist die Funktion VARCHAR_FORMAT erforderlich:
VARCHAR_FORMAT (https://www.ibm.com/docs/en/i/7.4?topic=functions-varchar-format)

... und dann sollte man immer darauf achten, dass man die Dokumentation der Db2 for i (und nicht Db2 LUW oder die einer anderen Datenbank) erwischt.

Die Umsetzung in das gewünschte Format sollte wie folgt funktionieren.

Values(Replace(VarChar_Format(Current_Timestamp, 'YYYY-MM-DD HH24:MI:SS.FF3'), ' ', 'T') concat 'Z');

Birgitta

pabloesco
26-08-21, 11:02
Vielen Dank für die Hilfe. Wie müsste ich den dies im RPG aufrufen? Ich habe es wie folgt probiert aber leider ist die Variable nach dem Aufruf trotzdem leer.


EXEC SQL SET :ts = Values(Replace(VarChar_Format( Current_Timestamp,
'YYYY-MM-DD HH:MM:SS.FF3'), ' ', 'T') concat 'Z');

B.Hauser
26-08-21, 11:24
Entweder

EXEC SQL SET :ts = Replace(VarChar_Format(Current_Timestamp,
'YYYY-MM-DD HH24:MI:SS.FF3'), ' ', 'T') concat 'Z';

Oder so:

EXEC SQL Values(Replace(VarChar_Format(Current_Timestamp,
'YYYY-MM-DD HH24:MI:SS.FF3'), ' ', 'T') concat 'Z') into :ts;

Birgitta

Ahoy
26-08-21, 12:06
Birgittas Lösung verwendet das 12-Stunden Format und Monate anstatt Minuten.

hier die korrigierte Variante:
values replace(varchar_format(current_timestamp - current_timezone , 'YYYY-MM-DD HH24:MI:SS.FF3'), ' ', 'T') concat 'Z';

Dabei ist zu beachten dass so nur die aktuelle Timestamp im ISO8601 Format ausgegeben werden kann. Wenn die Timestamp (leider ohne Zeitzone) zu einem früheren Zeitpunkt entstanden ist, ist es schwer nachzuvollziehen, unter welchem UTC Offset sie entstanden ist.

B.Hauser
26-08-21, 13:05
Birgittas Lösung verwendet das 12-Stunden Format und Monate anstatt Minuten.


Oups! Mal wieder nicht aufgepasst! Das merke ich dann meist (erst) beim Testen.
Ich habe meine Beispiele korrigiert (allerdings ohne Berücksichtigung der Zeitzone)

Fuerchau
26-08-21, 15:11
Im ILERPG gehts mit %CHAR auch ohne SQL.

%replace(%char(MyTimeStamp:*iso):' ':'T') + 'Z';

B.Hauser
26-08-21, 16:59
Im ILERPG gehts mit %CHAR auch ohne SQL.

%replace(%char(MyTimeStamp:*iso):' ':'T') + 'Z';

Bist Du sicher, dass Du damit genau 3 Positionen nach dem letzten Punkt hast? M.E. hast Du 6!

Fuerchau
26-08-21, 21:51
Ja, das kannst du dann auch noch mit %subst() kürzen.
Aber das weiß ja nun jeder;-).

Ich wollte ja nur die Frage bzgl. ILERPG beantworten, dass du da kein SQL brauchst.