2009-08-10 5 views
6

Necesito comparar dos valores de fecha y hora para determinar la igualdad (exactamente igual), usando la precisión de minutos. ¿Esta sería la mejor manera de hacerlo? Mis fechas pueden tener segundos y milisegundos, pero quiero considerar solo hasta minutos.Determine la igualdad de los valores de fecha y hora con la precisión de minutos dentro de LINQ

 where (Math.Abs(datetime1.Subtract(datetime2).TotalMinutes) == 0) 
+0

Me gustaría tomar ese fragmento y publicarlo como respuesta a su pregunta, de esa manera la gente puede comentar/votar hacia arriba o hacia abajo en su pregunta –

Respuesta

11

Comprobar si Math.Abs(diff.TotalMinutes) == 0 no lo hará, no - eso es comprobar si son exactamente lo mismo.

¿Está tratando de verificar si tienen el mismo minuto o si están a menos de un minuto de distancia? Para la primera, el uso:

where RoundToMinute(dateTime1) == RoundToMinute(dateTime2) 

haber declarado:

public static DateTime RoundToMinute(DateTime time) 
{ 
    return new DateTime(time.Year, time.Month, time.Day, 
         time.Hour, time.Minute, 0, time.Kind); 
} 

para el segundo, el uso:

where Math.Abs((dateTime1 - dateTime2).TotalMinutes) < 1 

usted debe considerar lo que desea que el resultado sea en el caso de que uno es local y uno está en UTC, por cierto ...

Tenga en cuenta que aquí no hay nada específico de LINQ, suponiendo que esté usando LINQ to Objects. Si está utilizando LINQ to SQL, entonces obviamente no puede usar métodos locales, y tendremos que volver a mirar ...

EDIT: Todavía no estoy muy claro sobre su pregunta. Si se necesita que sean exactamente la misma fecha/hora, es fácil (dejando a un lado la posible locales vs tema UTC):

where dateTime1 == dateTime2 

Sin embargo, esto plantea la pregunta de por qué usted menciona "un minuto de precisión" en el título de la pregunta o "usar precisión de hasta un minuto" en el cuerpo de la pregunta. .

+0

Jon - Tenía dudas sobre el uso de RoundToMinute (datetime) ya que las fechas de entrada podrían tener segundos y quería mantener una precisión mínima. Aunque Math.abs podría tirarlo también, supongo? ¡Podría (debería) quitarle los segundos antes de usar las fechas, por supuesto! Pero para responder a su consulta, sí, necesito que sean exactamente iguales – PreethaA

+1

@Preetha: si necesita que sean * exactamente * iguales, ¿de qué forma necesita "precisión minuciosa" según el título de la pregunta? –

+0

En caso de que tenga valores de fecha y hora entrantes, donde no puede estar seguro de si tienen o no segundos conectados, pero lo único que le importa es si son exactamente iguales ... hasta el momento. Supongo que la parte de stripseconds debe estar totalmente separada y preceder a la comparación real de los valores ... así que esto funcionaría en ese caso. – PreethaA

0

¿Qué tal

where (Math.Floor(datetime1.Ticks/600000000) == Math.Floor(datetime2.Ticks/600000000)) 

?

+0

exactamente lo que pensaba cuando vi la pregunta –

+0

Si se refiere a 'datetime1.Millisecond', eso no está bien, el valor siempre está entre 0 y 999. –

0

Gracias Allen, va a hacer que (! Todavía averiguar exactamente cómo funciona el proceso) Aquí está el fragmento de código que indica la respuesta que había llegado con un principio:

(Math.Abs ​​(datetime1.Subtract (datetime2) .TotalMinutes) == 0)

Antecedentes: Dentro de la cláusula WHERE de mi consulta de linq (de ahí una línea), necesito comprobar si datetime1 y datetime2 son exactamente iguales. Los valores de fecha y hora bajo consideración son fechas de sello para otros valores utilizados en la consulta.

+0

Como he editado en mi respuesta, solo use dateTime1 == dateTime2. Actualice su pregunta para deshacerse de la "utilización de precisión de hasta un minuto" ya que no es lo mismo que "exactamente lo mismo". –

Cuestiones relacionadas