PostgreSQL中的本地时间偏移量

33

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

为了获取表示数据库服务器时区与UTC之间差异的间隔,我目前正在使用以下方法:

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

那个方法可以用,但有没有更直接的方式?

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


谢谢您的问题。我添加了一个段落,解释了为什么我想要得到这个差异。 - TimH
3个回答

54
SELECT  current_setting('TIMEZONE')

这可以用在查询中,但是它并不提供数值差异。

您的解决方案很好。


谢谢,这就是我需要知道的。这个代码可以工作:SELECT some_table.utc_timestamp at time zone current_setting('TIMEZONE');对于阅读代码的人来说,这比我的hack清晰得多。 - TimH
唯一的缺点是它可能会产生一个类似于“-05:00”的偏移量,一个完整的时区名称像“澳大利亚/珀斯”,甚至是一个可能存在歧义的缩写像“EST”。 - Craig Ringer
1
@CraigRinger:CURRENT_SETTING('timezone') 返回的所有内容都可以毫无问题地传递给 AT TIME ZONE - Quassnoi
2
@TimH:我曾经吃过亏,时区缩写似乎优先考虑。避免使用模糊的时区名称,如CET - 它们会被解释为具有微妙不同效果的时区缩写。 - Erwin Brandstetter

11

为了得到秒数差作为整数,我仅仅使用了:

select extract( timezone from now() );

0
根据 shaunc的回答获取间隔。
select (extract(timezone from now()) || 'seconds')::interval;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接