2009-09-15 19 views
50

Estoy usando MS SQL 2005, y quiero verificar dos fechas para igualdad, pero ignorando la parte de tiempo.Comparar fechas en T-SQL, ignorando la parte de tiempo

Sé que puedo utilizar DATEDIFF, pero me preocupa que pueda ser lento: ¡este SP se usa mucho en el DB!

¿Alguna sugerencia?

Editar: comentario:

' David Andrés 'comparación' incluye mucho más que la igualdad'
me hizo darme cuenta de que yo no hice mi pregunta lo suficientemente claro - en realidad estoy comprobando por la igualdad, eso es todo .

+10

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

+0

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

Respuesta

81

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.

+3

¿no sería menos eficiente que simplemente usar _DATEDIFF (día, fecha1, fecha2) _? –

+0

estaba trabajando en una edición, está listo ahora. –

+2

No estaba realmente buscando una forma de quitarme el tiempo, sino una forma de comparar dos fechas ignorando el tiempo. Esto parece un poco más lento para mí ... –

6

En mi propio trabajo, cuando quería determinar que dos fechas eran iguales independientemente de la hora del día, he utilizado el siguiente:

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101) 

Por supuesto, "comparación" incluye mucho más que la igualdad y la Lo anterior convierte las fechas al formato de EE.UU. MM/DD/YYYY antes de hacer la comparación. Entonces, implicaciones de rendimiento e incapacidad para comparar diferencias de fechas.

Pero ... funciona.

4

Si su modelo de datos no satisface uno de los requisitos de su empresa (por ejemplo, si necesita comparar las fechas, pero no realiza un seguimiento de las fechas, solo las de fecha y hora), mira la posibilidad de afinar el modelo, no el método para sobrellevarlo.

¿Sería posible y útil almacenar la fecha solamente en una columna calculada indexada, o almacenar las partes de fecha y hora por separado?

33

DONDE DATEDIFF (día, fecha1, la fecha 2) = 0

2

Lo siento por la respuesta tardía.

siempre uso esta sintaxis para la fecha de comparación

WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112) 

siempre funciona muy bien siempre que convertir la fecha con 112 código de formato que en la fecha de regreso yyyyMMdd formato. compara la fecha en formato de cadena sin tiempo, pero funciona muy bien. gracias

+0

Su solución funcionó en un script que estaba escribiendo cuando "IF date_column! = GETDATE()" no. ¿Por casualidad sabes por qué es así? – CryptoJones

Cuestiones relacionadas