Можете да играете с GUC параметри datestyle
и timezone
вътре във функция, за да получите това, което искате. Ето един пример (но той връща микросекунди, така че вероятно ще трябва да го настроите малко):
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;
Резултати:
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)
Актуализация:редактирано. Можете да използвате timestamptz(3)
, указвайки точността (по подразбиране ще върви с микросекунди, докато 3
ще запази само милисекунди). Като алтернатива можете да използвате res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF');
вместо ::timestamptz(3)::text
верига за преобразуване и в този случай (3)
няма да са необходими.