PostgreSQL 中的本地时区偏移量
Posted
技术标签:
【中文标题】PostgreSQL 中的本地时区偏移量【英文标题】:Local time zone offset in PostgreSQL 【发布时间】:2011-01-07 18:55:09 【问题描述】:我的网络应用程序以 UTC 格式存储所有时间戳,没有时区。我有一个 shell/psql 脚本,它返回最近登录的列表,我希望该脚本在服务器的本地时区显示登录时间(这可能因服务器所在的位置和夏令时而异)。
为了获得代表我的数据库服务器的时区和 UTC 之间差异的时间间隔,我目前正在使用这个 hack:
SELECT age(now() at time zone 'UTC', now());
这行得通,但有更直接的方法吗?
有一个名为“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() );
【讨论】:
以上是关于PostgreSQL 中的本地时区偏移量的主要内容,如果未能解决你的问题,请参考以下文章