Почему 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:-)).