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. 
4

1 に答える 1

1

キャッシュは何をしますか?いくつかの定義条件がまだ保持されている場合は既成の結果が得られ、変更された場合は結果を再クエリ/再計算します。

それはあなたがキャッシュしなければならないことでもあります。現地時間が上書きされた場合はクエリを再実行し、継続中にキャッシュを使用してください。

クエリを再実行してください。すべての試行ではなく、必要な場合にのみ実行してください。http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms725498.aspx

ここで、ローカルのクロックではなく、サーバーのクロックが変更された場合にどうするかを本当に知りたいと思います。たぶん、あなたは本当にデータベースサーバーに沿って別々の時間同期サービスをインストールするでしょうか?

于 2012-12-07T07:28:40.760 に答える