За часовата зона можете:
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;
Кредит към Глен за 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;
Вижте също:
- Отместване на местната часова зона в PostgreSQL
- Как да разберете часова зона на клеймо в postgresql 8.3