admin

服务器时区偏移值

sql

我正在使用相对于数据库服务器的日期。

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

select tz_offset(SESSIONTIMEZONE) from dual;

或者

select tz_offset(DBTIMEZONE) from dual;

在我的情况下,这些将返回(重要的是包括符号)

-04:00

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


阅读 245

收藏
2021-06-07

共1个答案

admin

对于时区,您可以:

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不是我以前使用过extract(timezone fromcurrent_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;
2021-06-07