【问题标题】:Local time zone offset in PostgreSQLPostgreSQL 中的本地时区偏移量
【发布时间】:2011-01-07 18:55:09
【问题描述】:

我的网络应用程序以 UTC 格式存储所有时间戳,没有时区。我有一个 shell/psql 脚本,它返回最近登录的列表,我希望该脚本在服务器的本地时区显示登录时间(这可能因服务器所在的位置和夏令时而异)。

为了获得代表我的数据库服务器的时区和 UTC 之间差异的时间间隔,我目前正在使用这个 hack:

SELECT age(now() at time zone 'UTC', now());

这行得通,但有更直接的方法吗?

有一个名为“timezone”的服务器配置参数返回一个有效的时区字符串,但我认为不可能在查询中访问这些参数。 (我想这是一个单独的问题,但它的答案将解决时区问题。)

【问题讨论】:

  • 感谢您的提问。我添加了一段解释我为什么要获得差异。

标签: postgresql timezone


【解决方案1】:
SELECT  current_setting('TIMEZONE')

这可以在查询中使用,但是,这不会给出数值差异。

你的解决方案很好。

【讨论】:

  • 谢谢,这就是我需要知道的。这将起作用: SELECT some_table.utc_timestamp at time zone current_setting('TIMEZONE');对于阅读代码的人来说,这比我的黑客要清楚得多。
  • 唯一的缺点是它可以产生像'-05:00'这样的偏移量,像'Australia/Perth'这样的全长时区名称,甚至是像'EST'这样的潜在模糊缩写.
  • @CraigRinger:CURRENT_SETTING('timezone') 返回的所有内容都可以毫无问题地提供给AT TIME ZONE
  • @TimH:正如我发现的那样,time zone abbreviations seem to take precedence。远离含糊不清的时区名称,例如 CET - 它们会被解释为时区缩写,效果略有不同。
【解决方案2】:

为了将秒数差异作为整数,我简单地使用了:

select extract( timezone from now() );

【讨论】: