La única manera razonable de hacerlo es despojar la porción temporal de los valores de fecha y hora y comparar los resultados, y la mejor manera de despojar a la porción de tiempo a partir de una fecha y hora es la siguiente:
cast(current_timestamp as date)
solía usar y abogan por un proceso que se parecía a una de las dos líneas siguientes:
cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))
Pero ahora que SQL Server tiene el tipo Date
, que no mantenga un componente de tiempo, hay pocas razones para utilizar de esas técnicas.
Una cosa más a tener en cuenta aquí es que esto todavía va a empantanar una consulta si necesita hacerlo para dos valores de fecha y hora para cada fila en una cláusula where o condición de unión. Si es posible, debe factorizar esto de alguna manera para que se precalcule tanto como sea posible, por ejemplo, usando una vista o una columna calculada.
Finalmente, tenga en cuenta que la función DATEDIFF compara el número de límites cruzados. Por lo tanto, la fechada en días entre '2009-09-14 11:59:59'
y '2009-09-15 00:00:01'
es 1, aunque solo han transcurrido 2 segundos, pero DATEDIFF en días entre '2009-09-15 00:00:01'
y '2009-09-15 11:59:59'
sigue siendo cero, aunque hayan transcurrido 86,398 segundos. Tenga en cuenta que realmente no le importa en absoluto la porción de tiempo allí. Dependiendo de lo que intenta hacer su consulta, es posible que pueda usar eso para su ventaja.
No se preocupe por la optimización prematura: escriba su consulta usando 'DATEDIFF', luego vea si es un cuello de botella o no está examinando el plan de consulta. Si es un problema, busca una alternativa. – Welbog
Posible duplicado de [Mejor enfoque para eliminar la parte de tiempo de datetime en SQL Server] (http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql- servidor) – abatishchev