datetime
с точностью только до 1/300 секунды, поэтому он показывает только моменты с точностью до .000, .003 и .007 секунды (последняя - 2 трети секунды с округлением до 3 десятичных дробеймест).
Для вашего значения '9999-12-31 23:59:59.999'
SQL-сервер не может сохранить 0,009, поэтому он округляется до ближайшего значения, в этом случае это будет следующая секунда, что делает дату '10000-12-31 00:00:00.000'
, чтоне может быть сохранен ни в одном из типов данных даты и времени.
Если у вас есть .998
, ближайшее значение к округлению равно .997
, поэтому ошибка не возникает.
Если вы используете datetime2
, вы также не получите ошибку, так как она может быть с точностью до 1/10000000 в секунду: SELECT CAST('9999-12-31 23:59:59.999' AS datetime)