我在表格中有一个“带时区的时间戳”字段 我需要在给定时区返回is iso 8601字符串 我设法做的最接近的是:
select to_char(crtdate, 'YYYY-MM-DD"T"HH24:MI:SS.MSOF:"00"') from t1
但它返回系统默认时区(UTC)中的时间戳,如下所示:
2017-07-12T02:46:26.194+00:00
我需要将其格式化为特定时区 例如。
2017-07-12T14:46:26.194+12:00
代表“太平洋/奥克兰”。
有人可以建议如何实现这一目标吗?
我们在PG v 9.6上。
谢谢,
答案 0 :(得分:5)
您可以在函数内使用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)
。