로컬 날짜와 시간을 데이터베이스에서 반환 된 것과 동일한 날짜와 시간으로 동기화해야합니다.로컬 시간을 databaser 서버 시간과 동기화
는 SQL :
select first 1 CURRENT_TIMESTAMP from RDB$DATABASE
이 SQL 명령은 데이터베이스 서버의 현재 날짜와 시간을 반환합니다.
이제 이것을 캐싱하고 로컬 diff를 기반으로 올바른 시간을 제공해야합니다. 문제는 현지 날짜 및 시간을 다시 변경할 수 있다는 것입니다.
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;
이제 내 질문입니다 : QueryPerformanceCounter 및 QueryPerformanceFrequency가 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.
먼저 할 수 없습니다. 시간은 똑딱 거리고있어 클라이언트가 직접 읽어야합니다. 둘째, Vista 이상 (또는 비 파워 사용자로 실행 중일 때 XP)에서 시스템 날짜 또는 시간을 변경하려면 관리자 권한이 필요합니다. –
다른 댓글에 추가하려면 ... 당신은 시간이 뭔지 결코 알 수 없으며 단지 그것이 한 일이었습니다. 오래전에 해결 된이 문제를 처리하는 NTP와 같은 도구가 있습니다. –
나는 OS Datetime을 변경하고 싶지 않다. 데이터베이스 datetime에 대한 질의를하고 싶을 뿐이다. 데이터베이스에서 그 시간이 결코 바뀌지 않을 것이라고 가정한다. –