Bạn có thể chơi với các tham số GUC datestyle
và timezone
bên trong một chức năng để có được những gì bạn muốn. Đây là một ví dụ (tuy nhiên, nó trả về micro giây, vì vậy có thể bạn sẽ cần điều chỉnh nó một chút):
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;
Kết quả:
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)
Cập nhật:đã chỉnh sửa. Bạn có thể sử dụng timestamptz(3)
, chỉ định độ chính xác (theo mặc định, nó sẽ đi với micro giây, trong khi 3
sẽ chỉ giữ lại phần nghìn giây). Ngoài ra, bạn có thể sử dụng res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF');
thay vì ::timestamptz(3)::text
chuỗi chuyển đổi và trong trường hợp này là (3)
sẽ không cần thiết.