Почему SQL Server теряет миллисекунду? - PullRequest
62 голосов
/ 03 апреля 2009

У меня есть таблица, структурированная так:

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.

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

Ответы [ 6 ]

86 голосов
/ 04 апреля 2009

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
...

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

33 голосов
/ 04 апреля 2009

SQL Server 2008 обладает гораздо большей точностью. Тип datetime2 будет точно хранить такие значения: 2008-12-19 09: 31: 38.5670514 (с точностью до 100 наносекунд).

Ссылка: время и дата-время2 - Изучение новых типов данных даты / времени в SQL Server 2008

27 голосов
/ 03 апреля 2009

Тип SQL Server datetime имеет разрешение только 1/300 секунды, поэтому вы, вероятно, видите ошибку округления.

См. Ссылку MSDN Datetime SQL Server

6 голосов
/ 03 апреля 2009

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

3 голосов
/ 03 апреля 2009

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

2 голосов
/ 03 апреля 2009

SQL Server хранит значения даты и времени с точностью до 3 миллисекунд. (Я слышал об этом, но не могу найти официальную ссылку.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...