关于postgresql:如何在给定时区内将时间戳字段转换为ISO 8601字符串?

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参数datestyletimezone来获得所需内容。 这是一个例子(但是,它返回微秒,所以你可能需要稍微调整一下):

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)

更新:已编辑。 您可以使用timestamptz(3),指定精度(默认情况下,它将以微秒为单位,而3将仅保留毫秒)。 或者,您可以使用res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF');而不是::timestamptz(3)::text转换链,在这种情况下,不需要(3)