2

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

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

select tz_offset(SESSIONTIMEZONE) from dual;

或者

select tz_offset(DBTIMEZONE) from dual;

在我的情况下,这些会返回(重要的是它包括标志)

-04:00

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

4

2 回答 2

4

对于时区,您可以:

SHOW timezone;

或等价物:

SELECT current_setting('TIMEZONE');

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

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

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

...但是 IMO 以秒为单位提取 tz 偏移量current_timestamp并转换为间隔更干净:

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不是我之前使用的 hackextract(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;

也可以看看:

于 2012-09-09T10:57:32.037 回答
1

“to_char”格式化组件,修剪摆脱了“sign”字符,它只是正数的空格。

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

查看时间函数的文档

于 2012-09-09T00:37:21.093 回答