2012-12-06 132 views
0

我必須將本地日期和時間與從數據庫返回的相同日期和時間進行同步。將本地時間與數據庫服務器時間同步

的SQL:

select first 1 CURRENT_TIMESTAMP from RDB$DATABASE 

這個SQL命令返回在數據庫服務器的當前日期和時間。

現在,我需要緩存並提供基於本地比較的正確時間。 問題是,本地日期和時間可以再次更改。

如何在不執行SQL的情況下保證正確的日期時間?


我找到了一個解決方案:

var 
    SQLTimestamp: TDateTime=0; 
    LocalTimestamp: TDateTime=0; 

function SysUpTime : TDateTime; 
var 
    Count, Freq : int64; 
begin 
    QueryPerformanceCounter(count); 
    QueryPerformanceFrequency(Freq); 
    if (count<> 0) and (Freq <> 0) then 
    begin 
    Result := Count/Freq; 
    Result := result/SecsPerDay; 
    end 
    else 
    Result := 0; 
end; 

function RealTime: TDateTime; 
var 
    queryTime, dbTime: tdatetime; 
begin 
    if SQLTimestamp = 0 then 
    begin 
    queryTime := SysUpTime; 
    dbTime := // SQL QUERY EXECUTION 
    queryTime := SysUpTime - queryTime; 

    LocalTimestamp := SysUpTime; 
    SQLTimestamp := dbTime + queryTime; 
    end; 

    Result := SQLTimestamp + (SysUpTime - LocalTimestamp); 
end; 

現在的問題是QueryPerformanceCounterQueryPerformanceFrequency有相同的限制GetTickCount

The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days. 
+1

首先,你不能。時間不停,所以客戶需要直接閱讀。其次,在Vista和更高版本(或作爲非高級用戶運行時的XP)中,更改系統日期或時間需要管理員權限。 –

+1

要添加到其他評論...你永遠不能找出什麼是時間,只有它是什麼。有像NTP這樣的工具可以解決這個問題,很久以前就已經解決了。 –

+0

我不想更改操作系統的日期時間,我只想要查詢數據庫的日期時間,假設那些時間(在數據庫中)永遠不會改變。 –

回答

1

什麼是緩存?如果某些定義條件仍然存在,它會爲您提供現成的結果,或者如果結果發生更改,則會重新查詢/重新計算結果。

這就是你緩存必須做的。如果本地時間被覆蓋並且在連續使用緩存時重新執行查詢。

請重新執行查詢,只在需要時才執行,而不是在每次嘗試時執行。 http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms725498.aspx

現在我真的很想知道如果服務器的時鐘將會改變,而不是本地的,你會怎麼做。也許你會真的在hdatabase服務器上安裝單獨的時間同步服務?

+0

我改變了我的實現使用WM_TIMECHANGE重新緩存時間值,現在我使用「現在」功能。數據庫服務器的日期時間永遠不會改變,這是我假設的前提(我知道這可能會導致問題)!謝謝Arioch –

+0

Windows有許多通知「這個或那個發生了變化,我們不會假設你之前知道的上下文」,它不僅僅是時間:-) –

+0

如果有的話,服務器可以運行守護進程,只有監視它自己的時間變化,以便用戶FB的POST_EVENT通知客戶端的變化。 –

相關問題