- 在我們的項目中有時可能會碰到這種情況,資料庫伺服器和用戶端處於不同的時區,因此我們在設計我們的系統時需要考慮時間的同步問題,即處於不同時區的不同用戶端能夠從伺服器中擷取到一致的時間。而如果你的系統要同時支援SQL SERVER和ORACLE的話,那麼你就需要從中找出統一的處理方式,因為SQL SERVER和ORACLE在這個問題的處理方式上是不一樣的。本文要介紹的是使用.NET下解決方案。
下面介紹的是在ORACLE下可以採取的處理方式:
1. --------------------ORACLE伺服器----------------------------------------------------------------------------------
在create table時指定欄位為timestamp with time zone
--------------------用戶端--------------------------------------------------------------------------------------------
從伺服器取資料: 擷取欄位的值(DateTime類型)即可,Database Provider會自動做處理
向伺服器儲存資料: 直接傳遞用戶端DateTime對象的值
2. --------------------ORACLE伺服器----------------------------------------------------------------------------------
在create table時指定欄位為timestamp with local time zone
--------------------用戶端--------------------------------------------------------------------------------------------
從伺服器取資料: 擷取欄位的值(DateTime類型),並使用DateTime的ToLocalTime轉化為本地時區下的時間
向伺服器儲存資料: 直接傳遞用戶端DateTime對象的值
3. --------------------ORACLE伺服器----------------------------------------------------------------------------------
在create table時指定欄位為date,在服務端儲存為UTC時間
--------------------用戶端--------------------------------------------------------------------------------------------
從伺服器取資料: 擷取欄位的值(DateTime類型),並使用DateTime的ToLocalTime轉化為本地時區下的時間
向伺服器儲存資料: 將用戶端DateTime對象轉化為UTC時間,然後儲存至伺服器
預存程序等服務端資料儲存: 擷取UTC時間儲存到欄位中
3. --------------------ORACLE伺服器----------------------------------------------------------------------------------
在create table時指定欄位為date/timstamp,在服務端儲存為伺服器時區下的時間
--------------------用戶端--------------------------------------------------------------------------------------------
註:用戶端在啟動時候要擷取伺服器和用戶端的時區資訊,用用於後面的時間轉換。
從伺服器取資料: 擷取欄位的值(DateTime類型),並使用DateTime的ToLocalTime轉化為本地時區下的時間
向伺服器儲存資料: 將用戶端DateTime對象轉化為UTC時間,然後將UTC時間轉化為伺服器時間,然後儲存至伺服器
預存程序等服務端資料儲存: 擷取伺服器時間儲存到欄位中
因為SQL SERVER本身並沒有ORACLE對於TIME ZONE的處理機制,所以只能採取上面的第3種或第4中方式。因此如果你的系統如果要同時支援ORACLE和SQL SERVER,建議採用第3種處理方式,因為相對第4種處理方式用戶端不需要從服務端擷取時區資訊。
其它問題:
1. ORACLE伺服器使用的時區資訊是存在資料庫的執行個體中的,在安裝時制定,預設使用的GMT+0:00
2. SQL SERVER伺服器使用的是OS的時區資訊