2012-06-29 3 views
12

이번 주말은 12 월 30 일 23:59:59 이후에 extra second이 삽입되어 추가로 긴 주일입니다.SQL Server 2008에서 윤년 저장

우리는 24 시간 내내 많은 양의 데이터를 기록하는 시스템을 가지고 있으며, 비즈니스 규칙 중 하나는 두 개의 레코드가 동시에 발생하지 않았으며 1 초 이내에 기록되지 않는다는 것입니다.

우리는 새로운 datetimeoffset 데이터 형식과 함께 UTC datetimes를 사용하고 있습니다.하지만 내가 알 수있는 한, 1 분 안에 60 초 이상을 버틸 수는 없습니다.

물론,이 오류가 발생합니다 :

select datediff(ss, getdate(), '30-jun-2012 23:59:60') 

그러나 UTC 신들에 따라이 실제 시간이 될 것입니다. 이벤트는 23:59:60에서 발생할 수 있지만이 사실을 기록 할 방법이 없습니다.

23:59:59 더하기 1 초 오프셋은 여전히 ​​7 월 1 일에 00:00:00으로 간주됩니다.

데이터베이스의 23:59:60에 이벤트가 발생했는지 정확하게 기록하려면 어떻게해야합니까?

+4

비즈니스 규칙이 현실을 무시한 것처럼 보입니다. –

+1

어떻게 그렇게? 기록되는 이벤트는 물리적으로 1 초에 두 번 이상 발생할 수 없습니다. 나는 당신이 같은 프로젝트에서 일하고 있다는 것을 몰랐다. – Widor

+1

나는 농담으로 말하고 있었지만 현실은 시스템이 윤초에 대한 타임 스탬프를 저장할 수 없기 때문에 두 번째 도약 중에 초당 하나의 이벤트를 기록 할 수 없다는 것이다. 비즈니스 규칙은 전통적인 방법으로 쉽게 만날 수없는 것을 요구하고 있습니다. 규칙을 다시 생각해 보거나 윤초를 예외로 만들거나 미친 일회용 코드를 작성하십시오. –

답변

9

SQL은 Windows에서 시간을 가져오고 Windows에서도 윤초를 지원하지 않으므로 그렇게 할 수 없습니다.

Windows는 업스트림 시간 서버에서 새 시간을 가져 와서 간단한 조정 인 것처럼 보통 clock drift을 적용하여 윤초를 적용합니다.

일반적으로 이것은 오랜 기간 동안 각 나노초를 수 나노초 조정하는 것을 의미합니다. 24 시간이 넘으면 분당 약 1 밀리 초가 걸립니다. Windows 시간 서비스가 두 번째 도약 처리하는 방법을

기본적으로, 대부분의 응용 프로그램은 단순히 같은 것은 없다고 척 윤초로.

대부분의 경우이 내용은 중요하지 않습니다. 이 문제가있는 응용 프로그램이 있으면 OS가 도움이되지 않습니다. 운영체제는 일반적으로 어쨌든 초 이내에 시간을 유지하는 데 어려움이 있으므로 시간 추적을위한 특수 하드웨어가 필요할 것입니다. Windows는 기본적으로 주간 또는 그 이하의 시간을 동기화하며, 가장 저렴한 PC 하드웨어 시계 (또는 값 비싼 서버의 시계)는 그 시간에 수 초 동안 쉽게 표류 할 수 있습니다.

정확한 시간에 신경을 써서 pool.ntp.org 또는 지역 서브넷을 가리키고 있고 동기화를 위해 하루에 여러 번 w32time을 설정했다고 가정합니다.

+0

다음 NTP 동기화 시간을 적용하여, 당신의 시계는 미래가 당신의 시계가이 설정됩니다, 멀리 너무 길,하여 시스템 :)에 통합 할 수 있도록 둔화된다는 점에 유의 정확한 시간, 따라서 데이터베이스에 중복 항목과 동일한 문제가 발생합니다. MSDN : "... ... 클럭 속도를 조정하여 정확한 시간으로 수렴 할 수 있습니다. 시간차가 너무 길면 ... 시간 서비스가 로컬 시계를 설정합니다 ...] (https : //technet.microsoft.com/en-us/library/cc773013 (v = ws.10) .aspx # w2k3tr_times_how_izcr) " – eFloh