2017-02-22 147 views
1

我們正面臨着一個問題,即在基於Java的hibernate-spring REST API的Postgres表中存儲timestamp的DEFAULT值。Postgres時間戳列的默認值設置沒有得到正確使用

列設置爲

load_ts timestamp with time zone DEFAULT timezone('utc'::text, now()) NOT NULL, 

我們不從我們的代碼發送的任何時間戳值。 這是我們如何在實體類中指定時間戳字段。

@Column(name = "LOAD_TS", insertable = false, updatable = false) 
    private Timestamp loadTimeStamp; 

我們正在使用Amazon RDS Postgres DB。 DB參數組值'timezone'設置爲'UTC'。

預期 - 當沒有任何load_ts值發送到數據庫的插入請求到達數據庫時,load_ts應根據默認設置獲取UTC的時間戳。

實際 - 當插入請求到達數據庫時沒有任何load_ts值發送到數據庫時,load_ts將設置爲EASTERN TIME + 10小時。 API在東部時間運行。

當我們在DB中手動插入記錄時,時間戳會被正確生成並存儲。我們查看了RDS postgres中的log_statements,但沒有看到API在插入查詢中發送任何時間戳。另一個有趣的觀察是,當我們將API時區更改爲UTC時,時間戳被正確存儲。所以不知何故API正在將時區傳遞給數據庫。

應用棧 - 1)休眠芯版本 - 5.0.7

2)彈簧 - 4.2

3)的Postgres - 9.4

4)的Postgres駕駛員 - 9.4.1212.jre7

5)RDS Postgres DB時區參數組值 - UTC

6)應用程序在美國東部時間運行的時區。

回答

1

您的列定義沒有意義。函數now()返回類型timestamp with time zone。功能timezone()有幾種重載的變體,但最終調用的那個將返回timestamp without time zone。然後,您將其插入timestamp with time zone類型的列中。

我不想把我的頭圍繞在這裏實際發生的事情上,但我想因爲美國東部時間和UTC通常相距5個小時,而且你得到的是10小時的差異,你可能有時區偏移量應用兩次。

從你的描述,我覺得你真正想要的是定義列只是

load_ts timestamp with time zone DEFAULT now() NOT NULL, 

,一切都應該罰款。

+0

謝謝Peter的建議。我們想到做同樣的改變。我只是有點困惑,爲什麼只有當我通過hibernate應用程序插入數據時纔會發生這個問題。當我使用普通的sql插入語句插入數據時,時間戳是正確的。可能在這種情況下,timezone()會返回時區和時區的時間戳。 –

+0

由於從'沒有時區的時間戳'(函數結果)到'具有時區的時間戳記'(列類型)的轉換考慮了會話時區。如果您的應用程序和psql會話配置了不同的時區,則結果將會不同。 –

+0

感謝Ton了! –

相關問題