456 votos

Mejor método para eliminar el tiempo parte de datetime de SQL Server

El método que proporciona el mejor rendimiento al retirar la porción de tiempo a partir de un campo datetime de SQL Server?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

o

b) select cast(convert(char(11), getdate(), 113) as datetime)

El segundo método de enviar un par más bytes de cualquier manera, pero que podría no ser tan importante como la velocidad de la conversión.

También parecen ser muy rápidos, pero puede haber una diferencia en la velocidad cuando se trabaja con cientos de miles o más filas?

Además, es posible que incluso hay mejores métodos para deshacerse de la porción de tiempo de datetime de SQL?

497voto

gbn Puntos 197263

Estrictamente, el método a es el menos intensivo en recursos:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

Probada menos la CPU para la misma duración total de un millón de filas por algunos con demasiado tiempo en sus manos: la forma Más eficiente de SQL Server para obtener la fecha a partir de la fecha+hora?

Vi a una prueba similar en otros lugares con resultados similares.

Yo prefiero el DATEADD/DATEDIFF porque:

Edición, Octubre De 2011

Para SQL Server 2008+, puede convertir a date. O, simplemente, utilizar date así que no hay tiempo para quitar.

Edición, Enero De 2012

Un ejemplo práctico de cómo flexible, esto es: la Necesidad de calcular redondas de la hora o la fecha que figura en sql server

Edición, Mayo De 2012

No usar en las cláusulas where y similares sin pensar: la adición de una función o de FUNDICIÓN a una columna que invalida el uso de índices. Véase el número 2 aquí: http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

Ahora, esto tiene un ejemplo de posteriores de SQL Server optimizador de versiones gestión de los EMITIDOS hasta la fecha correctamente, pero en general será una mala idea ...

53voto

Anto Raja Prakash Puntos 449

En SQL2008, puede utilizar:

CONVERT(DATE,getdate(), 101)

19voto

Gary McGill Puntos 8009
SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

8voto

Jeff Meatball Yang Puntos 12021

He aquí otra respuesta, desde otra pregunta duplicada:

SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime)

Este número mágico método realiza ligeramente más rápido que el DATEADD método. (Es como parece ~10%)

El Tiempo de CPU en varias rondas de un millón de registros:

DATEADD   MAGIC FLOAT
500       453
453       360
375       375
406       360

Pero tenga en cuenta que estos números son posiblemente irrelevante porque ya están MUY rápido. A menos que yo tenía los conjuntos de registros de 100.000 o más, aún no podía llegar el Tiempo de la CPU para leer por encima de cero.

Considerando el hecho de que DateAdd tiene este propósito, y es más resistente, yo diría que el uso de DateAdd.

2voto

Joel Coehoorn Puntos 190579

Ver esta pregunta:
http://stackoverflow.com/questions/923295/how-to-truncate-a-datetime-in-sql-server

Hagas lo que hagas, no utilice el método de cadena. Que trata de la peor manera que podía hacerlo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X