In SQL Server 2008, why do the following queries return the same value?
-- These all return 2011-01-01 23:59:59.997
SELECT CAST(\'2011-01-01 23:59:59.997\' a
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.
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.
To get additional accuracy, there is the DateTime2 data type, available in SQL Server 2008 onwards, that can be accurate to 7 decimal places.