PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Zeitzonen-Offsetwert des Servers

Für die Zeitzone können Sie:

SHOW timezone;

oder das Äquivalent:

SELECT current_setting('TIMEZONE');

Dies kann jedoch in jedem vom Server akzeptierten Format vorliegen, sodass möglicherweise UTC zurückgegeben wird , 08:00 , Australia/Victoria , oder ähnlich.

Frustrierenderweise scheint es keine eingebaute Funktion zu geben, um den Zeitversatz von UTC zu melden, den der Client in Stunden und Minuten verwendet, was mir irgendwie verrückt erscheint. Sie können den Offset erhalten, indem Sie die aktuelle Uhrzeit in UTC mit der aktuellen Uhrzeit vor Ort vergleichen:

SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`

... aber meiner Meinung nach ist es sauberer, den tz-Offset in Sekunden aus dem current_timestamp zu extrahieren und in ein Intervall umwandeln:

SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');

Das entspricht dem gewünschten Ergebnis, außer dass es keine führende Null erzeugt, also -05:00 ist gerade -5:00 . Ärgerlicherweise scheint es unmöglich zu sein, to_char zu bekommen um stundenlang eine führende Null zu erzeugen, was mich mit der folgenden hässlichen manuellen Formatierung zurücklässt:

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;

Gutschrift an Glenn für timezone_hour und timezone_minute anstelle des zuvor verwendeten Hacks mit extract(timezone from current_timestamp) * INTERVAL '1' second) und einen CTE.

Wenn Sie die führende Null nicht benötigen, können Sie stattdessen verwenden:

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;

Siehe auch: