使本地时间与数据库服务器时间同步

时间:2012-12-06 17:35:54

标签: sql windows delphi firebird

我必须将本地日期和时间与从数据库返回的相同日期和时间同步。

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;

现在我的问题是QueryPerformanceCounterQueryPerformanceFrequencyGetTickCount有相同的限制?

 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 个答案:

答案 0 :(得分:1)

任何缓存有什么作用?如果某些定义条件仍然存在,它会为您提供现成结果,如果更改,则会重新查询/重新计算结果。

这也是你的缓存必须要做的事情。如果本地时间被覆盖,只需重新执行查询,并在连续时使用缓存。

重新执行查询,只在您需要时执行,而不是在每次尝试时执行。 http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms725498.aspx

现在我真的想知道如果服务器的时钟会被更改,你会做什么,而不是本地时钟。也许你真的在智能数据库服务器上安装了单独的时间同步服务?