2012-12-06 4 views
0

로컬 날짜와 시간을 데이터베이스에서 반환 된 것과 동일한 날짜와 시간으로 동기화해야합니다.로컬 시간을 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; 

이제 내 질문입니다 : 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

먼저 할 수 없습니다. 시간은 똑딱 거리고있어 클라이언트가 직접 읽어야합니다. 둘째, Vista 이상 (또는 비 파워 사용자로 실행 중일 때 XP)에서 시스템 날짜 또는 시간을 변경하려면 관리자 권한이 필요합니다. –

+1

다른 댓글에 추가하려면 ... 당신은 시간이 뭔지 결코 알 수 없으며 단지 그것이 한 일이었습니다. 오래전에 해결 된이 문제를 처리하는 NTP와 같은 도구가 있습니다. –

+0

나는 OS Datetime을 변경하고 싶지 않다. 데이터베이스 datetime에 대한 질의를하고 싶을 뿐이다. 데이터베이스에서 그 시간이 결코 바뀌지 않을 것이라고 가정한다. –

답변

1

캐시는 어떤 기능을합니까? 일부 정의 조건이 여전히 유효하거나 변경된 경우 결과를 다시 쿼리/재 계산하면 기성 결과를 얻을 수 있습니다.

캐시도 캐시해야합니다. 로컬 시간이 지나치게 길면 쿼리를 다시 실행하고 캐시가 지속되는 동안 캐시를 사용하십시오.

모든 시도가 아니라 필요할 때만 쿼리를 다시 실행하십시오. http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms725498.aspx

이제 서버의 시계가 로컬 시계가 아닌 시계가 변경되면 어떻게 할 것인지 알고 싶습니다. 어쩌면 당신은 진짜로 hdatabase 서버를 따라 별도의 시간 동기화 서비스를 설치하겠습니까?

+0

WM_TIMECHANGE를 사용하여 시간 값을 다시 캐시하기 위해 구현을 변경했는데 이제는 "지금" 기능. 데이터베이스 서버 날짜 시간은 결코 바뀌지 않을 것입니다. 이것은 전제입니다 (이것이 문제를 일으킬 수 있음을 알고 있습니다)!감사합니다 Arioch –

+0

Windows에는 "이전에 알고있는 컨텍스트를 가정하지 않도록 변경되었거나 변경되었습니다."라는 메시지가 여러 번 있는데, 시간 만이 아닙니다 :-) –

+0

서버에 데몬이 실행될 수 있습니다. 자신의 시간 변경을 모니터링하여 사용자 FB의 POST_EVENT에게 변경 사항을 알립니다. –

관련 문제