Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何将时间戳字段转换为给定时区中的ISO 8601字符串?_Postgresql - Fatal编程技术网

Postgresql 如何将时间戳字段转换为给定时区中的ISO 8601字符串?

Postgresql 如何将时间戳字段转换为给定时区中的ISO 8601字符串?,postgresql,Postgresql,我在表中有一个“带时区的时间戳”字段。 我需要返回给定时区中的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 而我需要将其格式化为特定时区。 例如 代表“太平洋/奥克兰” 有人能告诉我如何做到这一点吗 我们在第9.6页 谢谢,您可以在函数中

我在表中有一个“带时区的时间戳”字段。
我需要返回给定时区中的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
而我需要将其格式化为特定时区。
例如

代表“太平洋/奥克兰”

有人能告诉我如何做到这一点吗

我们在第9.6页


谢谢,

您可以在函数中使用GUC参数
datestyle
timezone
,以获得所需。下面是一个示例(但是,它返回微秒,因此您可能需要对其进行一些调整):

结果:

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,'iyy-MM-DDT HH24:MI:SS:MSOF')
而不是
::timestamptz(3)::text
转换链,在这种情况下,将不需要
(3)

@a_horse_和_no_名称这将以Postgres格式给出时间戳,而不是ISO 8601。您需要为当前
时区获取该值吗
GUC设置(由
设置时区=…;
)或者你想动态(不接触GUC)获取不同时区的ISO8601值?@a_horse_,内部没有名称,没有任何格式,没错,但是有一个默认的输出格式,这就是这里的重点。更重要的是,您的评论并不是主题发起者需要的方向--
在时区…
将为您提供一个不包含任何时区信息的值,而作者需要ISO 8601,带有小时轮班(但是,
在时区…
可以帮助您构建适当的自定义函数),如果您对“存在”有任何疑问输出格式—“日期/时间类型的输出格式可以设置为四种样式之一:ISO 8601、SQL(Ingres)、传统POSTGRES(Unix日期格式)或德语。”这可能会有所帮助:或者可能不正确地将时区偏移分钟附加为
| |':00'
。这种方法没有考虑到斯里兰卡等地的偏移量为UTC+05:30。
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)