Почему datetime вводит в SQL Server Compact круглые значения?

Я столкнулся с чем-то, что меня удивило.

я использую WinPcap собирать данные из сети. Внутренне WinPcap использует счетчики производительности Windows для создания своих временных меток. Я знаю, что они подвержены смещению, но эти временные метки, тем не менее, имеют точность вплоть до микросекундного уровня.

Если я вставлю эти временные метки в базу данных SQL Server Compact 4.0 как datetime Оценив их и извлекая позже, я заметил, что точность упала до миллисекунд.

Например,

10:52:19.706084 -> 10:52:19.706000

Теперь я прочитал здесь, что SQL Server округляет значения с datetime введите.000, .003 или.007 миллисекунд. Это объясняет, что происходит.

Теперь datetime Поле использует 8 байтов для хранения своих данных, 4 байта для даты и 4 для миллисекунд с полуночи. Но если я позвоню DateTime.ToBinary()Я возвращаю 8-байтовое число, которое представляет значение во всей его точности. На самом деле, если я запишу это значение в базу данных в bigint столбец, а затем позвоните DateTime.FromBinary() при извлечении этого значения я получаю исходное значение с той же точностью.

Это подход, который я собираюсь использовать, но мне все еще любопытно: почему не оригинал datetime введите использование SQL Server Compact DateTimeмеханизм хранения ToBinary/FromBinary?

РЕДАКТИРОВАТЬ:

Как справедливо отмечает Аарон Бертран, SQL Compact не поддерживает datetime2, В дальнейшем, datetime2 использует 6, 7 или 8 байтов, а не 54 байта в обычном SQL Server. Мой основной вопрос все еще стоит, хотя.

1 ответ

Решение

Я не знаю полных внутренних деталей или мотивов выбора, но datetime хранится внутри как - по существу - два 4-байтовых целых числа. Один представляет дату, другой представляет время. Я подозреваю, что вы теряете некоторую точность в последнем из-за способа обработки тиков / миллисекунд с самых первых версий SQL Server, но, опять же, я не знаю подробностей низкоуровневой реализации.

Связанные вопросы для получения дополнительной справочной информации:

Что такое внутреннее представление datetime на сервере sql?

Разрешить Entity Framework 4.5 для использования datetime2 с SQL Server CE4

Чтобы поддерживать требуемую точность без перемещения значения в двоичный формат и из него, я бы предложил использовать LocalDB, который обладает теми же преимуществами переносимости, что и Compact, но без многих ограничений функций (таких как поддержка более точного datetime2 тип - который, уверяю вас, занимает 6-8 байт, а не 54:-)).

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