Хранение високосной секунды в SQL Server 2008
Этот уикенд очень длинный, так как после него будет вставлена дополнительная секунда. 23:59:59
30 июня
У нас есть система, которая круглосуточно регистрирует большое количество данных, и одно из бизнес-правил заключается в том, что нельзя регистрировать две записи как произошедшие одновременно, с точностью до одной секунды.
Мы используем время по Гринвичу вместе с новым datetimeoffset
тип данных, но, насколько я могу судить, они не дадут вам больше 60 секунд в минуту.
Конечно, это выдает ошибку:
select datediff(ss, getdate(), '30-jun-2012 23:59:60')
Но согласно богам UTC это будет в реальном времени. События могут происходить на 23:59:60
но у нас нет возможности записать этот факт.
23:59:59
смещение плюс одна секунда все равно будет учитываться 00:00:00
1 июля.
Как я могу правильно записать, что событие произошло в 23:59:60
в базе данных?
1 ответ
Вы не можете, потому что SQL получает время от Windows, и Windows также не поддерживает високосные секунды.
Windows применяет дополнительные секунды, беря новое время с вышестоящего сервера времени и применяя обычные настройки, как если бы это был простой дрейф часов.
Обычно это означает корректировку каждой секунды на несколько наносекунд в течение длительного периода. В течение 24 часов он будет работать со скоростью около одной миллисекунды в минуту.
- Как служба Windows Time относится к високосной секунде: http://support.microsoft.com/kb/909614
- Включает ли структура Windows FILETIME дополнительные секунды?
- Как работает служба времени Windows: http://technet.microsoft.com/en-us/library/cc773013(v=ws.10).aspx
В основном, большинство приложений просто делают вид, что не существует такой вещи, как високосные секунды.
Для большинства целей это не имеет значения. Если у вас есть приложение, где это имеет значение, ОС не поможет вам. Вам также понадобится некоторое специальное оборудование для отслеживания времени, так как ОС, как правило, с трудом удерживает время с точностью до секунды. Windows по умолчанию синхронизирует время еженедельно или реже, и большинство дешевых аппаратных часов ПК (или даже те, которые установлены на дорогих серверах) могут легко дрейфовать за несколько секунд.
Поскольку вам важно точное время, я предполагаю, что вы указываете на pool.ntp.org или свою региональную подсеть и несколько раз в день устанавливали w32time для синхронизации.