PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment convertir le champ d'horodatage en chaîne ISO 8601 dans un fuseau horaire donné ?

Vous pouvez jouer avec les paramètres GUC datestyle et timezone à l'intérieur d'une fonction pour obtenir ce que vous voulez. Voici un exemple (cependant, il renvoie des microsecondes, vous devrez donc probablement l'ajuster un peu) :

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;

Résultats :

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)

Mise à jour :édité. Vous pouvez utiliser timestamptz(3) , en spécifiant la précision (par défaut, il ira avec des microsecondes, tandis que 3 ne conservera que des millisecondes). Alternativement, vous pouvez utiliser res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); au lieu de ::timestamptz(3)::text chaîne de conversion, et dans ce cas (3) ne sera pas nécessaire.