2009-04-03 3 views
55

Я таблица структурирована следующим образом:Почему SQL Server потерял миллисекунду?

CREATE TABLE [TESTTABLE] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [DateField] [datetime] NULL, 
    [StringField] [varchar](50), 
    [IntField] [int] NULL, 
    [BitField] [bit] NULL 
) 

я выполнить следующий код:

BEGIN 
    INSERT INTO TESTTABLE (IntField, BitField, StringField, DateField) 
    VALUES ('1', 1, 'hello', {ts '2009-04-03 15:41:27.378'}); 

    SELECT SCOPE_IDENTITY() 
END 

А потом

select * from testtable with (NOLOCK) 

и мой результат показывает:

2009-04-03 15:41:27.*377* 

для столбца DateField.

Любые идеи, почему я, кажется, теряю миллисекунду?

+0

я отметил ту же ошибку с датами, как '2008-12-31 23: 59: 59,999' –

+1

взгляд на это: SELECT CONVERT (DATETIME, «2008-12-31 23: 59: 59,999 ') –

+0

[См. Этот вопрос] (http://stackoverflow.com/questions/634122) для получения более подробной информации –

ответ

77

SQL Server хранит время примерно до 1/300 секунды. Они всегда падают на 0, 3 и 7 миллисекунд. Например. считая от 0 до в наименьшее приращение:

00: 00: 00.000
00: 00: 00.003
00: 00: 00.007
00: 00: 00.010
00: 00: 00.013
.. .

Если вам нужна эта миллисекундная точность, вокруг нее нет приятного пути. Лучшие варианты, которые я видел, - это хранить значение в полях пользовательских номеров и перестраивать его каждый раз, когда вы извлекаете значение, или хранить его как строку известного формата. Затем вы можете (опционально) сохранить «приблизительную» дату в родном типе даты ради скорости, но она вводит концептуальную сложность, которая часто не нужна.

+11

Обязательно прочитайте сообщение Роба Гаррисона о TIME и DATETIME2 - эти типы имеют гораздо более высокое разрешение. –

5

SQL Server работает только с точностью до 1/300 секунды. Он будет округлять значения до ближайшего 1/300-го.

+0

Спасибо за ответы. Заставляет меня чувствовать себя лучше. Мне просто нужно настроить модульные тесты. :) – sproketboy

+1

Закрыть, разрешение 3/1000 будет 000, 003, 006, 009 ... Разрешение 1/300 000, 003, 007, 010 ... – Eclipse

2

Я слышал, но не может найти официальную ссылку, что магазины SQL SERVER значения даты-времени с точностью до 3 мс.

3

DATETIME не имеет бесконечной точности - вы, вероятно, используете значение, которое не может быть точно представлено доступными битами.

Смежные вопросы