【问题标题】:Query returning UTC timezone although using AT TIME ZONE尽管使用 AT TIME ZONE 查询返回 UTC 时区
【发布时间】:2021-11-30 09:41:16
【问题描述】:

我有 GMT 时区的数据。我想将它们转换并显示在'America/New_York'

这是我使用的代码:

(d.start_time) AT TIME ZONE 'America/New_York'

它返回假设2021-10-25T09:30:00.000Z

9:30 是正确的时间。但为什么是 UTC 时区时间戳而不是 'America/New_York'

我尝试了with/without time zone::timestamp/::timestamptz 的各种变体,但我可能不明白这里的一些非常基本的东西......

我应该做些什么不同的事情才能使它成为'America/New_York' 时区中有效的上午 9:30 时间戳?

【问题讨论】:

  • d.start_time 的类型是什么? d.start_time 在没有时区转换的情况下返回什么? TimeZone 设置为什么(SHOW TimeZone)?
  • PostgreSQL 没有在其中放置“Z”。要么您使用的是 PostgreSQL 的非标准变体,要么您的连接库对您不利。
  • @jjanes 我明白了。我的“工具”真的有点不标准。但我必须使用它。我仍然可以将它解析为我想要的任何格式的字符串。那么正确的 Postgres 时间戳字符串应该是什么样子的呢?
  • @AdrianKlaver d.start_time 没有时区转换返回完全相同的格式,只是时间不同。我设置了 UTC 时区。但似乎我无法在我的工具中更改它。
  • 这似乎是Retool 的客户端问题。作为@jjanes,提到您显示的时间戳格式不是来自 Postgres。你在使用date time picker 组件吗?如果是这样,您可能想在这里查看 Date time picker 并查看 useLocalTimezone 的设置。

标签: postgresql


【解决方案1】:

结果正确:2021-10-25T09:30:00.000 是timestamp without time zone,它不是 UTC 时间戳,而是纽约市的当地时间。

如果您希望时间戳与纽约市的时区偏移一起显示,您必须做一些不同的事情:

SET timezone = 'America/New_York';
SELECT current_timestamp;

       current_timestamp       
═══════════════════════════════
 2021-10-11 12:45:49.881037-04
(1 row)

然后 PostgreSQL 将显示带有您想要的偏移量的 timestamp with time zone 值。

【讨论】:

  • 我明白了,谢谢。 SET timezone = 'America/New_York'; SELECT ... 是否有可能在“SET”附近返回语法错误?我正在使用一个有点奇怪的设置(retool + 只读数据库连接)。不确定这是否相关。
  • 应该可以;也许您的客户对此有疑问。您也可以使用SET LOCAL 仅更改当前数据库事务的参数。
  • 有没有办法在不设置时区的情况下实现我想要的?看来 Retool 客户端对此的行为非常奇怪,我限制使用它。
  • 我的意思是这样的to_char(e.start, 'YYYY-MM-DD"T"HH24:MI:SS".000-04:00"') as start,。我只是不确定它在最终用户的浏览器中会如何表现。
  • 只需使用您的查询并自己附加偏移量。它应该是可预测的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2015-09-28
  • 2011-03-14
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多