2012-06-29 43 views
12

Cuối tuần này là một giây dài nữa sẽ có một extra second được chèn sau 23:59:59 vào ngày 30 tháng 6.Lưu trữ giây nhảy vọt trong SQL Server 2008

Chúng tôi có một hệ thống ghi nhiều dữ liệu trên đồng hồ và một trong các quy tắc kinh doanh là không có hai bản ghi nào có thể được ghi lại như đã xảy ra cùng một lúc, trong vòng một giây.

Chúng tôi đang sử dụng dữ liệu UTC cùng với loại dữ liệu datetimeoffset mới, nhưng theo như tôi có thể nói, chúng sẽ không cho phép bạn có hơn 60 giây trong một phút.

Chắc chắn, điều này ném một lỗi:

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

Tuy nhiên, theo các vị thần UTC đây sẽ là một thời gian thực. Sự kiện có thể diễn ra tại 23:59:60 nhưng chúng tôi không có cách nào để ghi lại sự kiện này.

23:59:59 cộng với chênh lệch một giây sẽ vẫn được coi là 00:00:00 vào ngày 1 tháng 7.

Tôi làm cách nào để đăng nhập chính xác sự kiện xảy ra tại 23:59:60 trong cơ sở dữ liệu?

+4

Dường như quy tắc kinh doanh của bạn bỏ qua thực tế. –

+1

Làm thế nào? Các sự kiện được ghi lại không thể xuất hiện nhiều hơn một lần trong một giây. Tôi không biết bạn cũng đang làm việc trên cùng một dự án. – Widor

+1

Tôi đã nói chuyện vui vẻ, nhưng thực tế là hệ thống không thể lưu trữ một dấu thời gian cho bước nhảy vọt thứ hai, do đó không thể đăng nhập một sự kiện mỗi giây trong một giây nhảy vọt. Quy tắc kinh doanh đòi hỏi cái gì đó không thể dễ dàng được đáp ứng thông qua các phương tiện truyền thống. Suy nghĩ lại các quy tắc, tạo ngoại lệ cho những giây nhảy vọt hoặc viết mã một lần điên rồ. –

Trả lời

9

Bạn không thể, vì SQL lấy thời gian từ Windows và Windows cũng không hỗ trợ giây nhảy vọt.

Windows áp dụng giây nhảy vọt bằng cách lấy thời gian mới từ máy chủ thời gian ngược dòng và áp dụng các điều chỉnh thông thường như thể đơn giản là clock drift.

Thông thường điều này có nghĩa là điều chỉnh từng giây một vài nano giây trong một khoảng thời gian dài. Hơn 24 giờ, nó sẽ hoạt động ở khoảng một phần nghìn giây mỗi phút.

Về cơ bản, hầu hết các ứng dụng đơn giản giả vờ rằng không có những điều như vậy là giây nhảy vọt.

Đối với hầu hết các mục đích, điều này không quan trọng. Nếu bạn có một ứng dụng mà điều này quan trọng, hệ điều hành sẽ không giúp bạn. Bạn cũng sẽ cần một số phần cứng đặc biệt để theo dõi thời gian, vì hệ điều hành thường gặp khó khăn trong việc giữ thời gian trong vòng một giây. Windows theo mặc định đồng bộ hóa thời gian hàng tuần hoặc ít thường xuyên hơn, và hầu hết các đồng hồ phần cứng PC giá rẻ (hoặc thậm chí cả những máy chủ đắt tiền) có thể dễ dàng trôi dạt vài giây trong thời gian đó.

Vì bạn quan tâm đến thời gian chính xác, tôi cho rằng bạn đang trỏ đến pool.ntp.org hoặc mạng con trong khu vực của bạn và đã đặt w32time để đồng bộ hóa vài lần mỗi ngày.

+0

Hãy nhận biết rằng bằng cách điều chỉnh thời gian tại đồng bộ hóa ntp tiếp theo, đồng hồ của bạn sẽ chậm lại để cho tương lai tích hợp trong hệ thống của bạn :) Bằng cách này, khi đồng hồ của bạn quá xa, nó sẽ được đặt thành thời gian chính xác, do đó gây ra cùng một vấn đề với các mục trùng lặp trong cơ sở dữ liệu của bạn. MSDN: "[... điều chỉnh tốc độ đồng hồ ... để cho phép nó hội tụ vào đúng thời điểm. Nếu chênh lệch thời gian ... quá lớn ... dịch vụ thời gian đặt đồng hồ cục bộ ...] (https : //technet.microsoft.com/en-us/library/cc773013 (v = ws.10) .aspx # w2k3tr_times_how_izcr) " – eFloh

Các vấn đề liên quan