Concentrándonos específicamente en DATETIME, donde se permiten las conversiones desde int, hay dos razones para la discrepancia.
-
Excel usa una base de 1 para las fechas, SQL Server usa 0, es decir,
01/01/1900
cuando se convierte a un número en Excel es 1, sin embargo, en SQL es 0:SELECT CAST(CAST('19000101' AS DATETIME) AS INT);
Dará 0. -
Hay un error deliberado en Excel para permitir la portabilidad desde Lotus donde el error no fue deliberado*. Excel considera el 29 de febrero de 1900 una fecha válida, pero 1900 no fue un año bisiesto. SQL no tiene este problema, por lo que significa que hay un día adicional en el calendario de Excel.
*(leer más sobre esto sugiere que podría haber sido deliberado o considerado intrascendente)
ANEXO
Hay un Elemento de soporte de Microsoft que sacia: