Anda dapat bermain dengan parameter GUC datestyle
dan timezone
di dalam fungsi untuk mendapatkan apa yang Anda inginkan. Berikut ini contohnya (namun, ini mengembalikan mikrodetik, jadi mungkin Anda perlu menyesuaikannya sedikit):
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;
Hasil:
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)
Pembaruan:diedit. Anda dapat menggunakan timestamptz(3)
, menentukan presisi (secara default, ini akan berlangsung dengan mikrodetik, sementara 3
hanya akan menyimpan milidetik). Atau, Anda dapat menggunakan res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF');
bukannya ::timestamptz(3)::text
rantai konversi, dan dalam hal ini (3)
tidak akan dibutuhkan.