对于时区,您可以:
SHOW timezone;
或等价物:
SELECT current_setting('TIMEZONE');
但这可以是服务器接受的任何格式,因此它可能返回UTC
、08:00
、Australia/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_hour
而timezone_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;
也可以看看: