За часовата зона можете:
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