2013-06-03 48 views
0

employeesPostgreSQL的:創建表時指定默認時區

CREATE TABLE employees 
(
    id integer NOT NULL, 
    name text, 
    withouttz timestamp without time zone, 
    withtz timestamp with time zone, 
    CONSTRAINT primarykey_emp PRIMARY KEY (id) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE employees 
    OWNER TO chris; 

我在下面的方式插入兩個記錄的定義如下:

INSERT INTO employees(
      id, name, withouttz, withtz) 
    VALUES (1, 'test', '2011-01-01 00:00:00', '2011-01-01 12:00:00+03'); 

INSERT INTO employees(
      id, name, withouttz, withtz) 
    VALUES (2, 'test', '2011-01-01 00:00:00', '2011-01-01 12:00:00'); 

我寫了簡單的Java類select * from employees輸出以下內容:

col1: 1 
col2: test 
col3: 2011-01-01 00:00:00 
col4: 2011-01-01 07:00:00-8:00 

col1: 2 
col2: test 
col3: 2011-01-01 00:00:00 
col4: 2011-01-01 12:00:00-8:00 

問題: 有沒有辦法創建一個postgres表的timestamp with time zone,以便它認爲時區是UTC而不是服務器的本地時區?

注意:set timezone TO 'GMT';對我來說不是一個解決方案,因爲它只適用於特定的會話。此外,如果解決方案亙古不依賴於服務器的本地時區的所有

在此先感謝

+0

@ null.pointer,因爲我在我的問題中非常清楚地說過,'SET TIMEZONE TO'GMT';'對我來說不是一個解決方案。 – Chris

+0

再次閱讀postgresql文檔中有關時區的文檔。時區基於客戶端,而不是服務器。 SET TIMEZONE絕對是一個解決方案。 – cxdf

+0

此外,您可以檢出PGTZ環境變量以使其自動化。 – cxdf

回答

1

SQL中的日期,時間和時間戳相當笨拙。

我懷疑,在這種情況下,你想寫會是怎樣:

TIMESTAMP 'blah blha blah' AT TIME ZONE 'UTC' 

這將定義一個本地時間時間戳(不受轉換),則明確地把它當作UTC時間timestamptz。

1

時區是一個會話參數將是巨大的。設置會話的TIMEZONE是相對直接的。另見:postgres default timezone

SET TIMEZONE TO 'GMT';會做的。

編輯:我想你可以試試AT TIMEZONE 'GMT';,但我不確定兩者之間的區別。

編輯2:正如克雷格林格所說,以下似乎是你在找什麼。

ALTER DATABASE ...設置它的數據庫級別。如果你改變它在 postgresql.conf它是全球性的。詳情請參閱手冊。

+0

@Chris - 「SET TIMEZONE」是一個適合您的解決方案,因爲它不僅適用於單個會話。您可以將它集羣範圍應用於特定數據庫或特定用戶。有關詳細信息,請參閱精細手冊。哦 - 這與服務器的本地時區無關,但與客戶端無關。請花些時間閱讀日期/時間處理手冊。這很複雜,但它必須是。 –

+0

@RichardHuxton謝謝你的迴應。我剛剛在Postgresql 9.1 + Ubuntu 13.04上再次進行了測試。我可以再次確認它僅在會話級別保留。此外,我希望在創建表時創建一個解決方案 – Chris

+0

@Chris除非您想將自己的邏輯編碼到數據庫中,否則您無法在數據庫方面處理此問題。 – cxdf