Because there's no .999 and .998 fraction of a second in datetime type. You only have .990, .993 and .997.
So .998 is rounded down to .997, while .999 is rounded up. Read more about the type.
Question
We are attempting to strip the time off a DateTime variable:
DECLARE @Date DateTime
SET @Date = '01Jan2013 23:59:59.998'
PRINT DATEADD(dd, 0, DATEDIFF(dd, 0, @Date ))
SET @Date = '01Jan2013 23:59:59.999'
PRINT DATEADD(dd, 0, DATEDIFF(dd, 0, @Date ))
Result:
Jan 1 2013 12:00AM
Jan 2 2013 12:00AM
Why does 01Jan2013 23:59:59.999
come back as 2nd Jan rather than 1st Jan?
Solution
Because there's no .999 and .998 fraction of a second in datetime type. You only have .990, .993 and .997.
So .998 is rounded down to .997, while .999 is rounded up. Read more about the type.