服务器时区偏移值

时间:2012-09-08 23:57:33

标签: sql postgresql datetime

我正在处理与数据库服务器相关的日期。

在Oracle中,要获得完整的时区偏移,您可以使用以下内容:

select tz_offset(SESSIONTIMEZONE) from dual;

select tz_offset(DBTIMEZONE) from dual;

在我的情况下(重要的是它包括标志)

会返回
-04:00

我想知道Postgres中存在哪些功能以获得与上述Oracle版本完全相同的格式的结果?我需要知道服务器的时区偏移量,包括指示它落后于GMT / UTC的标志。

2 个答案:

答案 0 :(得分:3)

对于时区,您可以:

SHOW timezone;

或同等的:

SELECT current_setting('TIMEZONE');

但这可以采用服务器接受的任何格式,因此可能会返回UTC08:00Australia/Victoria或类似内容。

令人沮丧的是,似乎没有内置函数来报告客户端在几小时和几分钟内使用UTC的时间偏移,这对我来说似乎有点疯狂。您可以通过将当前UTC时间与当地时间进行比较来获得偏移量:

SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`

...但IMO更清楚地从current_timestamp提取tz偏移量并转换为间隔:

SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');

除了没有产生前导零之外,它会匹配所需的结果,因此-05:00只是-5:00。令人讨厌的是,似乎不可能让to_char产生几个小时的前导零,让我留下以下丑陋的手动格式:

CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone_hour FROM current_timestamp),'FM00')||':'||
       to_char(extract(timezone_minute FROM current_timestamp),'FM00');
$$ LANGUAGE 'SQL' STABLE;

感谢Glenn timezone_hourtimezone_minute,而不是我之前使用extract(timezone from current_timestamp) * INTERVAL '1' second)和CTE的黑客攻击。

如果您不需要前导零,则可以使用:

CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
$$ LANGUAGE 'SQL' STABLE;

另见:

答案 1 :(得分:1)

“to_char”格式化组件,修剪摆脱了“符号”字符,这只是一个正数字的空间。

select trim(to_char(extract(timezone_hour from now()), '00')) ||
       ':' ||
       trim(to_char(extract(timezone_minute from now()), '00')) AS tz

查看documentation的时间函数。