我尝试将Postgres日期表示格式转换为ISO8601字符串,我假设有一个Postgres函数可以做到这一点,但我发现文档中缺少示例。
我的问题是
SELECT
now()::timestamp
其返回
[{{2016, 8, 9}, {3, 56, 55, 754181}}]
我正在尝试将日期转换为看起来更像2016-8-9T03:56:55+00:00
的格式。
我需要对我的查询做什么修改才能做到这一点?谢谢你的帮助。
我尝试将Postgres日期表示格式转换为ISO8601字符串,我假设有一个Postgres函数可以做到这一点,但我发现文档中缺少示例。
我的问题是
SELECT
now()::timestamp
其返回
[{{2016, 8, 9}, {3, 56, 55, 754181}}]
我正在尝试将日期转换为看起来更像2016-8-9T03:56:55+00:00
的格式。
我需要对我的查询做什么修改才能做到这一点?谢谢你的帮助。
6条答案
按热度按时间js4nwp541#
我想我找到了一种方法来做格式,但它不是理想的,因为我自己写的格式。
下面是一个可能的解决方案:
s2j5cfk02#
这是"将PostgreSQL日期表示转换为ISO 8601字符串"的简洁方法:
它结合使用
#>>
运算符和to_json()
函数,两者都可以在此页面上找到:https://www.postgresql.org/docs/current/functions-json.html运算符"获取指定路径的JSON对象作为文本"。但是,当您指定空数组文字
'{}'
作为路径时,它指定根对象。将此方法与类似方法进行比较:
它更短,但产生相同的结果。
User@atoth指出,使用
to_json()
删除了subsecond部分的尾随零,因此2022-03-31 17:39:23.500
被转换为2022-03-31T17:39:23.5Z
。由于一些日期接收者需要非常特定的格式,因此我测试了以下内容:这是Postgres 10的输出:
因此,使用
MS
可以指定3位小数,不能多也不能少,而使用US
可以指定6位小数,不能多也不能少。除了这两个精度选项,您还必须进行一些时髦的字符串操作。好好玩!
Date()
构造函数解析第一个方法的输出,因为它期望简化ISO 8601,ISO 8601只接受 *(+/-)HH:mm * 或 * Z * 格式的时区,但是OF
返回不带分钟的 *(+/-)HH * 格式,除非输入时区是小时的一部分,例如在会话开始时使用SET timezone=-4.5;
。或者,您可以手动将时区作为字符串附加到冗长的版本中,并排除OF
wlsrxk513#
也许对某些人来说,知道以下内容会很有帮助:Postgres 9.4
to_json
函数(以及row_to_json
)也将时间戳转换为适当的ISO 8601格式,但除此之外,它还将一个值用引号括起来,这可能是不可取的:f8rj6qna4#
将
timezone
会话变量设置为希望输出所在的时区,然后使用to_char(now(), 'YYYY-MM-DD"T"HH24:MI:SSOF')
如果使用
at time zone '...'
,请注意这将剥离所有时区信息,并假设用户已经知道时区。如果使用
at time zone 'UTC'
,则输出应该始终是UTC时间,并带有正确的时区信息(无偏移)。This blog post给出了相当详细的解释。
rta7y2nd5#
唯一的功能为我工作,因为你需要设置时区。
若要使时区具有默认值timezone:
创建function:
和输出:
再看看this:
如果你想让服务器返回另一个时区的时区信息,我相信你需要使用SET TIME ZONE,否则,服务器会自动(转换时间戳)返回服务器的时区。
ve7v8dk26#
简单/琐碎:
或者如果爱好者需要使用