2012-09-08 94 views
2

我與日期相對於數據庫服務器的工作。服務器時區偏移值

在Oracle中,得到充分的時區偏移,你會使用類似以下內容:

select tz_offset(SESSIONTIMEZONE) from dual; 

select tz_offset(DBTIMEZONE) from dual; 

這些將返回,在我的情況(重要的是它包含的符號)

-04:00 

我想知道Postgres中存在哪些功能來獲得與上述Oracle版本完全相同的格式?我需要知道,表明它暫時落後或提前GMT/UTC時區的服務器包含符號的偏移。

回答

3

的時區,您可以:

SHOW timezone; 

或等價的:

SELECT current_setting('TIMEZONE'); 

,但是這可以在服務器接受任何格式,所以它可能會返回UTC08:00Australia/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; 

感謝格倫的timezone_hourtimezone_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; 

參見:

+0

多麼令人難以置信的回覆。非常感謝您的專業知識。 – xingyu

1

的「TO_CHAR」格式化組件,修剪擺脫了「徵」字是隻爲正數的空間。

select trim(to_char(extract(timezone_hour from now()), '00')) || 
     ':' || 
     trim(to_char(extract(timezone_minute from now()), '00')) AS tz 

查看時間函數的documentation

+0

不要使用'裝飾'這裏用'FM00'代替。 –

+0

雖然爲'timezone_minute'和'timezone_hour'+1;便利。 –