How to convert timestamp field to ISO 8601 string in a given time zone?
本问题已经有最佳答案,请猛点这里访问。
我在表格中有一个"带时区的时间戳"字段。
我需要返回在给定时区中作为iso 8601字符串。
我设法做的最接近的事是:
1 | SELECT to_char(crtdate, 'YYYY-MM-DD"T"HH24:MI:SS.MSOF:"00"') FROM t1 |
但它返回系统默认时区(UTC)中的时间戳,如下所示:
1 | 2017-07-12T02:46:26.194+00:00 |
而我需要将其格式化为特定时区。
例如。
1 | 2017-07-12T14:46:26.194+12:00 |
为"太平洋/奥克兰"。
有人可以建议如何实现这一目标吗?
我们在PG v 9.6。
谢谢,
您可以在函数内使用GUC参数
1 2 3 4 5 6 7 8 9 10 11 12 | 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; |
结果:
1 2 3 4 5 6 7 8 9 10 | 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) |
更新:已编辑。 您可以使用