Я столкнулся с нечетной ошибкой, использующей поля datetime в SQL Server 2005. Поле datetime отображается с точностью до миллисекундного уровня, но похоже, что миллисекунды не являются всегда используется. Вот мой тестовый запрос:Запрос в полях datetime с миллисекундами дает неправильный результат в SQL Server
SELECT col1, YEAR(col1) AS yr, MONTH(col1) AS mn, DAY(col1) AS dy
FROM mytable
WHERE col1 >= '2009-12-31 00:00:00.0' AND col1 <= '2009-12-31 23:59:59.999'
ORDER BY col1
В мои результаты я получаю:
col1 | yr | mn | dy ----------------------------+------+----+---- 2009-12-31 00:00:00:00.000 | 2009 | 12 | 31 2010-01-01 00:00:00:00.000 | 2010 | 1 | 1
Проблема заключается в том, что я получил 2010-01-01 дату, несмотря на то, что не должно быть меньше или равно к «2009-12-31 23: 59: 59.999». Но если я изменил запрос на использование «2009-12-31 23: 59: 59.99 « он работает нормально (время возврата не возвращается).
Это ошибка, или это как раз то, как работает SQL Server? Если это так, то есть ли для этого причина? Я столкнулся с тем, что переносил некоторые запросы из MySQL, где это работает как ожидалось (хотя MySQL даже не хранит миллисекунды!).
Если это вариант в вашем коде, использование меньше: «... И col1 <'2010-1-1 00: 00: 00.0' –
Просто добавьте ссылку: http://msdn.microsoft.com/en-us/library/ms187819.aspx 'Точность: округленная до инкрементов .000, .003 или .007 секунд' –
3.33-миллисекундные тики. Интересно, почему они выбрали это? Если они хранят его как 32-битную дату и 32-битное время, общее количество миллисекунд в день составляет всего 0x05265c00, что соответствует 32-битовому целому числу с запасным номером. – Jenni