我正在处理相对于数据库服务器的日期。
在 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 时间偏移(以小时和分钟为单位),这对我来说似乎有点疯狂。您可以通过将UTC当前时间与本地当前时间进行比较来获取偏移量:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
...但在我看来,从 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_month
,而不是我之前使用的 hack 的 extract(timezone from current_timestamp) * INTERVAL '1' secondary)
和 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;
另请参阅:
关于sql - 服务器时区偏移值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335438/