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.
题
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?
解决方案
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.