对于时区,您可以:
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 的 hack。
如果您不需要前导零,您可以改用:
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;
另见: