Хранение високосной секунды в 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 по умолчанию синхронизирует время еженедельно или реже, и большинство дешевых аппаратных часов ПК (или даже те, которые установлены на дорогих серверах) могут легко дрейфовать за несколько секунд.

Поскольку вам важно точное время, я предполагаю, что вы указываете на pool.ntp.org или свою региональную подсеть и несколько раз в день устанавливали w32time для синхронизации.

Другие вопросы по тегам