2009-08-25 74 views
2

我們在兩個單獨的位置有兩個數據庫。其中一個數據庫位於與我們的用戶不同的時區。Oracle日期字段 - 時間問題

問題是,當位於單獨時區的數據庫更新並帶有Date值時,數據庫自動從它傳遞的日期中減去1:00小時。

問題是,當傳遞NULL日期(12:00:00)時,DAY值更改爲前一天。

更新通過存儲過程完成,前端是一個VB.NET智能客戶端。

你會如何處理這種適當的方式?我基本上不想存儲時間,但我似乎無法弄清楚如何做到這一點。

+0

Oracle數據庫中的列是否定義爲DATE?一個TIMESTAMP?帶有[本地]時區的TIMESTAMP? – 2009-08-25 15:04:43

+0

通過數據庫鏈接或直接從您的vb應用程序完成更新? – Christian13467 2009-08-25 15:09:11

+0

該列是DATE列。 – jgallant 2009-08-25 15:27:34

回答

2

不清楚數據庫中您想要的日期時間或應用程序傳遞的內容。

假設用戶的PC告訴他它是星期二上午12點30分,並且Db服務器上的時鐘週一晚上11點30分說。

如果爲'當前日期'(例如TRUNC(SYSDATE))插入一個值,那麼就數據庫而言,它仍然是星期一。 如果你爲'當前時間(例如SYSDATE)插入一個值,它仍然是星期一。 如果爲會話的當前時間(例如CURRENT_TIMESTAMP)和時區插入一個值,並要求數據庫將其存儲在數據庫中,它將存儲下午11:30。 如果您要求數據庫存儲日期時間'2009-12-31 14:00:00',那麼它將存儲它。如果您要求它存儲日期時間/時區'2009-12-31 14:00:00 +08:00',則表示您處於高級手冊中。您可以要求數據庫使用timezone data來存儲時間戳。也考慮daylight saving

1

我會調查使用TRUNC函數在您更新表的存儲proc方法。如果方法中的數據類型(更新表格)不是DATE類型,則使用to_date函數和TRUNC函數一起使用。

1

這不在您提問的範圍之內,但我會建議在所有用戶從不同時區訪問數據庫的情況下,應將服務器和數據庫時鐘時區設置爲UTC。這可能爲時已晚,但將數據庫服務器設置爲UTC可消除夏令時和不同時區帶來的問題。

在我的觀點中,日期/時間數據可以並且應該總是以UTC存儲。這些數據可以在提交給用戶的地方轉換爲本地時間。實際上,使用TIME ZONE數據類型的TIMESTAMP可以讓Oracle輕鬆實現。它允許您以UTC(SYS_EXTRACT_UTC)或本地時間(本地到數據庫服務器)的方式訪問數據。

世界上的所有地方都不是同一天,所以日期不能沒有時間考慮。

當然,我的另一個看法是夏時制應該被淘汰。但那是另一個話題。