PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie konvertiert man das Zeitstempelfeld in eine ISO 8601-Zeichenfolge in einer bestimmten Zeitzone?

Sie können mit den GUC-Parametern datestyle spielen und timezone innerhalb einer Funktion, um zu bekommen, was Sie wollen. Hier ist ein Beispiel (es gibt jedoch Mikrosekunden zurück, also müssen Sie es wahrscheinlich ein wenig optimieren):

create or replace function timestamp_iso8601(ts timestamptz, tz text) returns text as $$
declare
  res text;
begin
  set datestyle = 'ISO';
  perform set_config('timezone', tz, true);
  res := ts::timestamptz(3)::text;
  reset datestyle;
  reset timezone;
  return replace(res, ' ', 'T') || ':00';
end;
$$ language plpgsql volatile;

Ergebnisse:

test=# select timestamp_iso8601(now()::timestamptz, 'Europe/Moscow');
       timestamp_iso8601
-------------------------------
 2017-07-12T08:56:58.692985+03:00

test=# select timestamp_iso8601(now()::timestamptz, 'Pacific/Auckland');
       timestamp_iso8601
-------------------------------
 2017-07-12T17:59:05.863483+12:00
(1 row)

Aktualisierung:bearbeitet. Sie können timestamptz(3) verwenden , wobei die Präzision angegeben wird (Standardmäßig werden Mikrosekunden verwendet, während 3 hält nur Millisekunden). Alternativ können Sie res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); verwenden statt ::timestamptz(3)::text Conversion-Kette, und in diesem Fall (3) wird nicht benötigt.