我正在处理与数据库服务器相关的日期。
在Oracle中,要获得完整的时区偏移,您可以使用以下内容:
select tz_offset(SESSIONTIMEZONE) from dual;
或
select tz_offset(DBTIMEZONE) from dual;
在我的情况下(重要的是它包括标志)
会返回-04:00
我想知道Postgres中存在哪些功能以获得与上述Oracle版本完全相同的格式的结果?我需要知道服务器的时区偏移量,包括指示它落后于GMT / UTC的标志。
答案 0 :(得分:3)
对于时区,您可以:
SHOW timezone;
或同等的:
SELECT current_setting('TIMEZONE');
但这可以采用服务器接受的任何格式,因此可能会返回UTC
,08:00
,Australia/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_hour
和timezone_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的时间函数。