2015-10-08 71 views
0

我在同一臺服務器上有許多數據庫,代表每個時區(太平洋,山區,中部和東部)的不同時區。現在我的程序使用諸如'NOW'CURRENT_TIMESTAMP之類的東西來獲取記錄的當前時間。這是個問題。每Firebird數據庫修改CURRENT_TIMESTAMP

使用SymmetricDS將數據從單獨的計算機同步到此中央服務器。但是,我遇到的問題是,在此中央服務器上運行的程序被寫入,就好像它們在辦公室本地一樣。這意味着當它調用時間戳時,它會在服務器的可能不代表他們辦公室的時區執行。結果導致某些數據連續性混亂。

除了通過程序並重寫每一種利用當前時間的情況之外,我們更願意找到一種方法來在每個數據庫中以不同的方式表示時間......不知何故分別在每個數據庫中抵消時區。

儘管我已經完成了大量的閱讀,但我可以找到與此主題相關的內容,我有什麼選擇?

+0

如果你知道時區,你可以將它存儲在數據庫中,並可以使用'dateadd(hour,-cast(:tz_hour as integer),current_timestamp);' –

+0

困境是我們想要改變所有的時間Firebird中的相關函數和上下文變量爲我們做到了這一點。我們擁有龐大的代碼體系,並且在任何地方替換它都會花費大量時間:\ – user2085722

+0

不幸的是,除了可能使您的服務器以UTC運行外,沒有實際的選擇,因此所有系統至少使用相同的日期(但是如果客戶在當地時區插入時間或時間戳,仍然可能造成嚴重破壞)。 –

回答

1

我認爲你應該爲這個任務創建一個程序。

首先,您可以從一張新桌子開始。讓我們用以下結構:Basic office database

而且讓我們創建以下存儲過程:

create or alter procedure GETTIMESTAMP (
    IOFFICE_ID bigint) 
returns (
    RTIMESTAMP timestamp) 
as 
begin 
    RTIMESTAMP=dateadd(hour,coalesce((select TIMEDIFF from OFFICE_TIMEZONE where OFFICE_ID_=:IOFFICE_ID),0), current_timestamp); 
    suspend; 
end 

此過程將返回正確的時間。如果辦公室不存在,它將返回本地服務器的current_timestamp。

當然,需要一些工作才能將其存入數據庫。爲了簡化操作,您可以搜索數據庫元數據。 IBExpert具有簡單的搜索對話框,但您也可以導出元數據並通過記事本進行搜索。 IBExpert search in metadata