我正在使用相对于数据库服务器的日期。
在Oracle中,要获取完整的时区偏移量,您将使用以下内容:
select tz_offset(SESSIONTIMEZONE) from dual;
或者
select tz_offset(DBTIMEZONE) from dual;
在我的情况下,这些将返回(重要的是包括符号)
-04:00
我想知道Postgres中存在什么功能来获得与上述Oracle版本完全相同的格式的结果?我需要知道服务器的时区偏移量,包括表示它在GMT / UTC之前或之后的符号。
对于时区,您可以:
SHOW timezone;
或等效的:
SELECT current_setting('TIMEZONE');
但是这可以在服务器接受任何格式,所以它可能会返回UTC,08:00,Australia/Victoria,或类似的。
UTC
08:00
Australia/Victoria
令人沮丧的是,似乎没有内置功能可以报告客户使用的以小时和分钟为单位的UTC时间偏移,这对我来说似乎很疯狂。您可以通过将UTC的当前时间与本地的当前时间进行比较来获得偏移量:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
…但是IMO可以更方便地从秒中提取tz偏移量current_timestamp并将其转换为时间间隔:
current_timestamp
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
除了不会产生前导零外,这将与所需结果相匹配,-05:00只是-5:00。烦人的是,似乎不可能在to_char数小时内产生前导零,这使我无法使用以下丑陋的手动格式设置:
-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_hour而timezone_minute不是我以前使用过extract(timezone fromcurrent_timestamp) * INTERVAL '1' second)的CTE和骇客。
timezone_hour
timezone_minute
extract(timezone fromcurrent_timestamp) * INTERVAL '1' second)
如果不需要前导零,则可以使用:
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;