Что на самом деле означает точность в SQL Server (дата-время)

#sql-server #datetime

#sql-сервер #дата и время

Вопрос:

Я действительно сбит с толку чем-то, что называется Точностью SQL Server .

Я нашел некоторую информацию о date time типах данных и в SQL server , но я заметил нечто, называемое точностью. Поэтому, пожалуйста, кто-нибудь может мне помочь и объяснить простым способом понять, что на самом деле accuracy означает? Заранее огромное спасибо.

Комментарии:

1. «Я заметил что-то с именем accuracy» , где вы «наблюдали» это? Что вы делали, когда увидели эту «точность»? Вы говорите о том, что a datetime с точностью до 1/300 секунды, а a datetime2(n) с точностью до 1/(10*n) секунды?

2. Я имею в виду точность в Datetime в SQL Server, что означает точность таким образом?

3. datetime с точностью до 1/300 секунды; у него нет свойства точности.

4. хорошо, но, пожалуйста, объясните, что означает точность? Я нашел это по этой ссылке w3schools.com/sql/sql_datatypes.asp

5. Это говорит вам именно то, что я только что сказал вам в приведенных выше комментариях, когда упоминается точность… «с точностью до 3,33 миллисекунд» = «с точностью до 1/300 секунды»

Ответ №1:

Все сводится к тому, сколько у вас бит и, возможно, сколько вы решите использовать. 1-бит имеет 2 возможных значения. 2 бита имеют 4. 3 имеет 8. В общем случае, учитывая n бит памяти, существует 2 ^ n возможных различных значений. Байт с 8 битами может иметь 256 значений.

Для положительного целого числа, хранящегося в байте, диапазон от 0 до 255, поскольку ноль считается одним из возможных значений. Включение отрицательных чисел не изменяет количество значений. Например, байт со знаком может иметь диапазон от -127 до 128. (Дополнение 2 удобно для аппаратного обеспечения.)

Все «точно» для целых чисел с ограничением по диапазону. Для чего-то вроде времени или расстояния мы используем действительные числа. Свойство действительных чисел заключается в том, что между любыми двумя действительными числами существует бесконечное число действительных чисел. Любой, если мы выбираем диапазон, недостаточно байтов для представления всех действительных чисел между ними. Мы приближаем число, присваивая некоторые биты экспоненте, а некоторые — мантиссе.

Короче говоря, мы присваиваем фиксированное количество битов для представления бесконечного числа значений времени в заданном диапазоне.

Для smalldatetime 1-е 2 байта относятся к дню, а 2-е 2 байта — к времени. Для даты и времени каждый из них равен 4 байтам. Часть smalldatetime day в 2 байта допускает 2 ^ 16 значений или 65536 дней. 65536 * (1 год / 265 дней) = 179 соответствует диапазону лет для smalldatetime. Для части дня даты и времени 2 ^ 32 / 365 = 11767 лет больше, чем используемый диапазон даты и времени от 1753 до 9999. Хранилище есть, но инженерам не обязательно им пользоваться.

Теперь перейдем к временной части. Дата-время может быть преобразовано в число с плавающей запятой. Целой частью будет день, а дробью — доля дня. (Это не работает для datetime2.)

Если мы использовали каждый бит временной части, то 2 байта позволяют получить 65 536 значений, а 4 байта — 4 294 967 296 значений за один день. Это наилучшие возможные точности для каждого.

 24 hr * (3600 sec/ 1 hr) * (1000 ms / 1 sec) / 4,294,967,296  = .02 milliseconds
24 hr * (3600 sec/ 1 hr) / 1 sec) / 65,536 = 1.3 seconds  
 

Это не те точности, которые решили использовать инженеры Microsoft; однако они являются лучшими, которые могут быть сохранены в этом количестве байтов. Выбор точности в 3 мс, вероятно, был связан с ограничениями аппаратного обеспечения и API в то время. (Медленные часы HW могли быть единственным стандартом.) Точность в 1 минуту, вероятно, была округлена. Не может быть секунды, поэтому давайте округлим ее до минут.

Конечным результатом является то, что если вы измерите время 1 миллион раз с момента до миллисекунды и сохраните его в datetime, вы увидите, что хранится не более 1 или 2 различных значений. Если вы сохраните его как smalldatetime, вы увидите не более 1 или 2 различных значений. Если вы видите 2 значения, это потому, что вы перешли в интервал следующего значения.

Ясно, как грязь?