【问题标题】:Synchronizing local time with databaser server time本地时间与数据库服务器时间同步
【发布时间】:2012-12-06 17:35:54
【问题描述】:

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

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. 

【问题讨论】:

  • 首先,你不能。时间在流逝,所以客户需要直接阅读。其次,在 Vista 及更高版本(或以非超级用户身份运行的 XP)上,更改系统日期或时间需要管理员权限。
  • 要添加到其他 cmets... 你永远无法知道时间是什么,只能知道它是什么。有 NTP 之类的工具可以解决这个问题,这个问题早就解决了。
  • 我不想改变操作系统的日期时间,我只想有一个速记来查询数据库的日期时间,假设那个时间(在数据库中)永远不会改变。跨度>
  • 您提出了两个完全不同的问题。您想知道如何避免询问服务器现在几点了吗?或者你想知道 QueryPerformanceCounter 的局限性吗?请编辑您的问题以仅提出 一个 问题。请记住,您可以发布不限数量的单独问题,并且当您的单独问题彼此不相关时,我们鼓励这样做,就像这里的情况一样。跨度>
  • 您希望函数的精度是多少?

标签: sql windows delphi firebird


【解决方案1】:

缓存有什么作用?如果某些定义条件仍然成立,它会为您提供现成的结果,或者如果它们发生更改则重新查询/重新计算结果。

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

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

现在我真的很想知道如果更改服务器的时钟而不是本地时钟,你会怎么做。也许您真的会在 hdatabase 服务器上安装单独的时间同步服务?

【讨论】:

  • 我将实现更改为使用 WM_TIMECHANGE 重新缓存时间值,现在我正在使用“now”函数。数据库服务器的日期时间永远不会改变,这是我假设的前提(我知道这会导致问题)!谢谢 Arioch
  • Windows 有许多通知“这个或那个发生了变化,你不要假设你以前知道的上下文”,这不仅仅是时间 :-)
  • 如果有的话,服务器可以运行守护进程,只是为了监控它自己的时间变化,向用户FB的POST_EVENT通知客户端变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
相关资源
最近更新 更多