sql >> Databasteknik >  >> RDS >> PostgreSQL

Serverns tidszon offsetvärde

För tidszonen kan du:

SHOW timezone;

eller motsvarande:

SELECT current_setting('TIMEZONE');

men detta kan vara i vilket format som helst som accepteras av servern, så det kan returnera UTC , 08:00 , Australia/Victoria , eller liknande.

Frustrerande nog verkar det inte finnas någon inbyggd funktion för att rapportera tidsförskjutningen från UTC som klienten använder i timmar och minuter, vilket verkar ganska vansinnigt för mig. Du kan få offset genom att jämföra den aktuella tiden i UTC med den aktuella tiden lokalt:

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

... men IMO är det renare att extrahera tz-offset på några sekunder från current_timestamp och konvertera till ett intervall:

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

Det matchar det önskade resultatet förutom att det inte ger en inledande nolla, så -05:00 är bara -5:00 . Irriterande nog verkar det vara omöjligt att få to_char att producera en inledande nolla i timmar, vilket lämnar mig med följande fula manuella formatering:

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;

Tack till Glenn för timezone_hour och timezone_minute istället för hacket jag använde tidigare med extract(timezone from current_timestamp) * INTERVAL '1' second) och en CTE.

Om du inte behöver den inledande nollan kan du istället använda:

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;

Se även:



  1. Oracle MIN som analytisk funktion - udda beteende med ORDER BY?

  2. Överträdelse av integritetsbegränsning:1062 Dubblettpost '1' för nyckel 'PRIMÄR'

  3. MySQL:Kan en lagrad procedur anropa ett Java-program?

  4. ORA-01749:du får inte BILJA/ÅTERVÄLLA privilegier till/från dig själv