2014-09-10 3 views
9

Попробуйте сами, может быть, это как-то связано с моей среде:Почему CAST ('20140904 23: 59: 59.999' AS datetime) равен '2014-09-05 00: 00: 00.000'?

Запрос:

SELECT CAST('20140904 23:59:59.999' AS datetime) 

Результат:

2014-09-05 00:00:00.000 

Пожалуйста, объясните это явление.

ОБНОВЛЕНИЕ: Алекс отметил, что значения datetime округлены до приращений .000, .003 или .007 секунд. Вопрос в том, почему?

+2

Существует уже ответ на это ... посмотрите здесь ..... [здесь есть explanaition ...] [1] [1]: HTTP: // переполнение стека.com/questions/1506446/t-sql-query-returns-items-it-shouldnt-be – kamokaze

ответ

11

datetime values are rounded to increments of .000, .003, or .007 seconds

Я думаю, вы должны использовать

SELECT CAST('20140904 23:59:59.997' AS datetime) 

Это возвращает:

2014-09-04 23:59:59.997 

Вы можете найти более подробную информацию здесь: http://msdn.microsoft.com/en-us/library/ms187819.aspx

Это точность функции даты и времени в SQL.

Возможно, вы использовали datetime2, если используете более новую версию MSSQL, так как точность составляет 100 наносекундов.

Datetime2: http://msdn.microsoft.com/en-us/library/bb677335.aspx

+4

Вопрос в том, почему? –

+4

@AnarKhalilov Поскольку тип 'datetime' имеет конечную точность и не сохраняется как десятичное число? :) Обратите внимание, что 'datetime2' имеет гораздо большую точность, например. – Luaan

+1

@AnarKhalilov это, без сомнения, связано с неточностями значений с плавающей запятой. Согласно [этой странице] (http://floating-point-gui.de/languages/sql/), стандарт SQL предписывает использовать внутреннюю двойную точность IEEE754. – MarioDS

3

Инкременты являются частью API спецификации: см this link.

значений даты и времени округлены до шагом .000, .003 или .007 секунд, как показано в следующей таблице.

Я нашел this link который имеет в конце лучшее объяснение.

На самом деле, SQL Server хранит там часы с полуночи. Каждый тактовый сигнал эквивалентен 3,33 миллисекундам. Это также причина, почему тип данных DATETIME имеет точность одного три сотых секунды.

DATETIME - 2 x 4 байта (дата + время). Временная часть хранится как количество тиков с полуночи. Каждый тик равен 3,33 мс.

Если вам нужна более высокая точность, взгляните на тип DATETIME2. Точность DATETIME2 составляет 100 нс.

+0

Очевидно, что DATETIME2 также совместим с ISO 8601, что может быть полезно в некоторых сценариях. –

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

  • Нет связанных вопросов^_^