É porque string vazia
''
não é NULL
. Se você fizer:select Cast(null AS datetime)
SAÍDA:
-----------------------
NULL
(1 row(s) affected)
CAST e CONVERT (Transact-SQL)
Quando dados de caracteres que representam apenas componentes de data ou de hora são transmitidos para o datetime ou smalldatetime tipos de dados, o componente de hora não especificado é definido como 00:00:00.000 e o componente de data não especificado é definido como 1900-01-01.