SQL Server 2008 and milliseconds
The accuracy of DateTime within SQL Server has always been to 1/300s of a second (3.33ms), so any value that does not divide precisely gets rounded.
- 997 stays as it is
- 998 will round to 997
- 999 will round up to 000
To get additional accuracy, there is the DateTime2 data type, available in SQL Server 2008 onwards, that can be accurate to 7 decimal places.
The MSDN docs for datetime at http://msdn.microsoft.com/en-us/library/ms187819.aspx say
Time range == 00:00:00 through 23:59:59.997 Accuracy == Rounded to increments of .000, .003, or .007 seconds
In the linked document there is also a section "Rounding of datetime Fractional Second Precision".
datetime2
gives you more accuracy.