Preso dai Books Online:
Values with the datetime data type are stored internally by the Microsoft SQL Server 2005 Database Engine as two 4-byte integers. The first 4 bytes store the number of days before or after the base date: January 1, 1900. The base date is the system reference date. The other 4 bytes store the time of day represented as the number of milliseconds after midnight.
I valori del tipo dato Datetime sono memorizzati dall'engine di SQL Server come 2 interi a 4 byte. I primi 4 byte sono il numero di giorni prima o dopo la data di base che è 1/1/1900. La data base è la data di riferimento del sistema. Gli altri 4 bytes contengono il numero di millisecondi dopo la mezzanotte.
The smalldatetime data type stores dates and times of day with less precision than datetime. The Database Engine stores smalldatetime values as two 2-byte integers. The first 2 bytes store the number of days after January 1, 1900. The other 2 bytes store the number of minutes since midnight.
I valori memorizzati dal tipo dato SmallDateTime sono un dato con una precisione inferiore a quella di DateTime. L'engine del database memorizza gli SmallDatetime in 2 interi a 2 bytes. I primi 2 bytes sono il numero di giorni dopo l' 1/1/1900. Gli altri 2 bytes sono il numero di minuti dopo la mezzanotte.
Quindi, se ti basta memorizzare date maggiori al 1° gennaio 1900 e non hai bisogno di memorizzare un dato più preciso del minuto, puoi usare lo smalldatetime altrimenti usa il Datetime.
Cosa uso io?
Sempre e solo il Datetime. Perché? semplificazione, trovarsi a dover manovrare due tipi diversi di date può essere noioso e dare origine a casini se i dati li manovri da VB o C# e inoltre ricordiamoci che nel 21° secolo, lo spazio su disco non è un problema

saluti
Sabrina