Zapytanie o pola datetime z milisekundami daje błędny wynik w SQL Server

W systemie SQL Server 2005 uruchamiam nieparzysty błąd przy użyciu pól datetime. Dokładność datetime pokazuje milisekundę, ale wygląda na to, że milisekundy nie zawsze są używane. Oto moje zapytanie testowe:

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

W moich wynikach otrzymuję:

 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

Problem polega na tym, że dostałem datę 2010-01-01, nawet jeśli nie powinna ona być mniejsza lub równa „2009-12-31 23: 59: 59.999”. Ale jeśli zmienię zapytanie do użycia ”2009-12-31 23: 59: 59,998„działa poprawnie (nie są zwracane żadne dane dat 2010).

Czy jest to błąd, czy też tak działa SQL Server? Jeśli tak to działa, czy jest jakiś powód? Wpadłem na tę migrację niektórych zapytań z MySQL, gdzie działa to zgodnie z oczekiwaniami (chociaż MySQL nawet nie przechowuje milisekund!).

questionAnswers(4)

yourAnswerToTheQuestion