Postgresql 选择带有本地utc偏移的tz感知时间戳

Postgresql 选择带有本地utc偏移的tz感知时间戳,postgresql,timezone,Postgresql,Timezone,所以我存储了一个时区感知时间,比如莫斯科的中午12点,作为2014-01-22 12:00:00+04。我想返回它,但如果我只是调用从我的\u表中选择我的\u时间戳,它将返回2014-01-22 08:00:00+00。我有一个带有时区奥尔森名称的timezone列(在本例中为europe/moscow),我是否可以构造一个select来返回我输入的确切对象,并保留其时区,而不是将其转换为我服务器的本地时间(GMT)?我已经看了一看postgres的文档,其中提到了时区的功能,但在返回时没有成功

所以我存储了一个时区感知时间,比如莫斯科的中午12点,作为
2014-01-22 12:00:00+04
。我想返回它,但如果我只是调用
从我的\u表中选择我的\u时间戳
,它将返回
2014-01-22 08:00:00+00
。我有一个带有时区奥尔森名称的
timezone
列(在本例中为
europe/moscow
),我是否可以构造一个select来返回我输入的确切对象,并保留其时区,而不是将其转换为我服务器的本地时间(GMT)?我已经看了一看postgres的文档,其中提到了时区的
功能,但在返回时没有成功地让它保留时区信息。

看看这是否有帮助:

SELECT now(), now()::timestamp, now() AT TIME ZONE 'europe/moscow', now()::timestamp AT TIME ZONE 'europe/moscow'

你可以在时区之间转换。不提供时区+04,但提供该时区的时间。

不,没有办法。PostgreSQL不存储插入或更新值的客户端的偏移量

如果将该偏移量存储在单独的列中,则可以将其与时间戳值连接起来,但在涉及夏令时的某些情况下,可能会返回错误的值


在时区使用
语法和正确的时区应该会为您提供正确的时间戳值,但它不会包括最初插入或更新时间戳的客户端的偏移量。

Erwin Brandstetter不久前给出了一个很好的答案,您可能会发现这个答案很有用:谢谢bma,这是一个相当全面的细分。遗憾的是,我想我必须将时间存储为天真的,并在我的应用程序代码中结合我的时区。请注意,开发人员的建议是否不是专门指没有日期组件的时间?我正在使用时区的时间戳。
@bbm:是的,谢谢你指出这一点。我不知道我在想什么。