Postgres:JSONB字符串与TZ的时间戳

bxpogfeg  于 2023-05-23  发布在  其他
关注(0)|答案(2)|浏览(132)

在postgres数据库(9.4)中,我将数据保存为JSON对象。包括一些日期时间元素。为了在SQL查询中进行时间比较,我必须将此字符串转换为时间戳。我试过这个查询:

SELECT to_timestamp('2015-05-22T10:56:04.949Z','YYYY-MM-DD HH:MI:SS.MS');
-- dummy query just to test converting

OUTPUT: 2015-05-22 10:56:04.949+03

它基本上工作正常,除了,我不知道如何包括时区参数。这个字符串是UTC时间10:56 AM,如果我运行这个查询,我会得到+03时区的10:56(+03是我的本地时区)。根据Postgres文档,应该将TZ添加到格式字符串中以获取时区,但它不起作用。
如何格式化这个字符串,使它也包括时区从最初的日期-时间字符串?

xriantvc

xriantvc1#

据我所知,不可能从字符串中解析时区。
但是,如果你知道你的时间戳总是在UTC时区,你可以用途:

SELECT to_timestamp('2015-05-22T10:56:04.949Z','YYYY-MM-DD HH:MI:SS.MS')::timestamp at time zone '00:00'
1mrurvl1

1mrurvl12#

只是需要注意的是,从PostgreSQL开始,没有特定含义的12个字符不再被忽略,所以时间前面的“T”导致之前的答案错误。模式需要跳过T,将其括在双引号中

SELECT to_timestamp('2015-05-22T10:56:04.949Z','YYYY-MM-DD"T"HH:MI:SS.MS')::timestamp at time zone '00:00'

从文档:
在PostgreSQL 12之前,可以使用非字母或非数字字符跳过输入字符串中的任意文本。例如,to_timestamp('2000 y 6 m1 d','yyyy-MM-DD')用于工作。现在,您只能使用字母字符用于此目的。例如,to_timestamp('2000 y 6 m1 d','yyyyytMMtDDt')和to_timestamp('2000 y 6 m1 d','yyyy“y“MM“m“DD“d”')跳过y、m和d。

相关问题