Concentrandosi specificamente su DATETIME, dove sono consentiti i cast da int, ci sono due ragioni per la discrepanza.
-
Excel utilizza una base di 1 per le date, SQL Server utilizza 0, ovvero
01/01/1900
quando convertito in un numero in Excel è 1, tuttavia, in SQL è 0:SELECT CAST(CAST('19000101' AS DATETIME) AS INT);
Darà 0. -
C'è un errore deliberato in Excel per consentire la portabilità da Lotus dove il bug non era intenzionale*. Excel considera il 29 febbraio 1900 una data valida, ma il 1900 non è stato un anno bisestile. SQL non presenta questo problema, quindi significa che c'è un giorno in più nel calendario di Excel.
*(ulteriori letture su questo suggeriscono che potrebbe essere stato deliberato o considerato irrilevante)
APPENDICE
È presente un elemento di supporto Microsoft che soddisfa: