sql >> Databáze >  >> RDS >> PostgreSQL

Jak převést pole časového razítka na řetězec ISO 8601 v daném časovém pásmu?

Můžete si hrát s parametry GUC datestyle a timezone uvnitř funkce, abyste získali to, co chcete. Zde je příklad (vrátí však mikrosekundy, takže jej pravděpodobně budete muset trochu vyladit):

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;

Výsledky:

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)

Aktualizace:upraveno. Můžete použít timestamptz(3) , s uvedením přesnosti (ve výchozím nastavení to bude s mikrosekundami, zatímco 3 zachová pouze milisekundy). Případně můžete použít res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); místo ::timestamptz(3)::text konverzní řetězec a v tomto případě (3) nebude potřeba.




  1. Jak nahradit nový řádek v Oracle

  2. CREATE TABLE zpětné inženýrství v Oracle

  3. Jak obnovit databázi MySQL z WAMP?

  4. Odeberte čísla z řetězcového serveru SQL