sql >> Database >  >> RDS >> PostgreSQL

Hoe een tijdstempelveld naar ISO 8601-tekenreeks in een bepaalde tijdzone te converteren?

Je kunt spelen met GUC-parameters datestyle en timezone binnen een functie om te krijgen wat je wilt. Hier is een voorbeeld (het geeft echter microseconden terug, dus waarschijnlijk moet je het een beetje aanpassen):

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;

Resultaten:

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)

Update:aangepast. U kunt timestamptz(3) . gebruiken , met vermelding van de precisie (standaard gaat het met microseconden, terwijl 3 bewaart slechts milliseconden). U kunt ook res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); gebruiken in plaats van ::timestamptz(3)::text conversieketen, en in dit geval (3) zal niet nodig zijn.




  1. Oracle Shutdown-fout ORA-01033

  2. MySQL migreren naar Firebase

  3. ORA-00933:SQL-opdracht niet correct beëindigd

  4. Atomisch ingestelde SERIAL-waarde bij het plegen van transactie