La mejor manera es:
SELECT DATEADD(day, DATEDIFF(Day, 0, @ADate), 0)
Esto se debe a que, internamente, SQL Server almacena todas las fechas como dos números enteros, de los cuales el primero es el ****número de días*** desde el 1 de enero de 1900. (El segundo es la porción de tiempo, almacenada como el número de segundos desde medianoche (segundos para SmallDateTime
s, o milisegundos para DateTime
s)
Usar la expresión anterior es mejor porque evita todas las conversiones, leyendo y accediendo directamente a ese primer entero en una representación interna de fechas sin tener que realizar ningún procesamiento... los dos ceros en la expresión anterior (que representan 1 enero de 1900), también se utilizan directamente sin procesamiento o conversión, porque coinciden con la representación interna del servidor SQL de la fecha 1 de enero de 1900 exactamente como se presenta (como un número entero).
*NOTA. En realidad, el número de límites de fechas (medianoches) que debe cruzar para pasar de una fecha a otra.