2009-08-10 4 views
6

J'ai besoin de comparer deux valeurs datetime pour déterminer l'égalité (exactement la même chose), en utilisant une précision minutieuse. Serait-ce la meilleure façon de le faire? Mes dates pourraient avoir des secondes et des millisecondes, mais je veux considérer seulement jusqu'à des minutes.Déterminer l'égalité des valeurs Datetime avec une précision minuscule dans LINQ

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

Je prendrais cet extrait et le posterais comme une réponse à votre question, de cette façon les gens peuvent commenter/voter dessus ou en bas dessus séparément de votre question –

Répondre

11

Vérifiez si Math.Abs(diff.TotalMinutes) == 0 ne le fera pas, non - c'est de vérifier si elles sont exactement le même. Essayez-vous de vérifier s'ils ont la même minute ou s'ils sont à moins d'une minute d'écart? Pour la première, utilisez:

where RoundToMinute(dateTime1) == RoundToMinute(dateTime2) 

ayant déclaré:

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

Pour la seconde, utilisez:

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

Vous devriez considérer ce que vous voulez que le résultat soit dans le cas où on est local et on est en UTC, en passant ...

Notez qu'il n'y a rien de spécifique à LINQ ici - en supposant que vous êtes utilisant LINQ to Objects. Si vous utilisez LINQ to SQL, alors vous ne pouvez évidemment pas utiliser les méthodes locales, et nous devrons revoir ...

EDIT: Je ne suis toujours pas très clair sur votre question. Si vous avez besoin d'être exactement la même date/heure, il est facile (en laissant de côté la possible locale vs numéro UTC):

where dateTime1 == dateTime2 

Cependant, cela pose la question de savoir pourquoi vous parlez de « minute précision » dans le titre de la question ou "utiliser jusqu'à une précision minutieuse" dans le corps de la question. .

+0

Jon - Je me méfiais de l'utilisation de RoundToMinute (datetime) car les dates entrantes pouvaient possiblement avoir des secondes et je voulais garder une précision minuscule. Bien que Math.abs pourrait le jeter aussi bien je devine? Je pourrais (devrait) dépouiller les secondes avant d'utiliser les dates bien sûr! Mais pour répondre à votre question, oui je les ai besoin d'être exactement les mêmes – PreethaA

+1

@Preetha: Si vous avez besoin d'eux * exactement * la même chose, alors de quelle manière avez-vous besoin de "précision minute" selon le titre de la question? –

+0

Si vous avez des valeurs datetime, vous ne savez pas si elles ont des secondes attachées, mais tout ce qui vous intéresse est de savoir si elles sont exactement les mêmes ... à la minute près. Je suppose que la partie stripesecondes devrait être totalement séparée et précéder la comparaison réelle des valeurs ... donc cela fonctionnerait dans ce cas. – PreethaA

0

Que diriez-vous

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

?

+0

exactement ce que j'ai pensé quand j'ai vu la question –

+0

Si vous voulez dire 'datetime1.Millisecond', ce n'est pas correct - la valeur est toujours comprise entre 0 et 999. –

0

Merci Allen, va le faire (! Encore déterminer exactement comment fonctionne le processus) Voici l'extrait de code indiquant la réponse que j'étais venu avec d'abord:

(Math.abs (datetime1.Subtract (Contexte: Dans la clause WHERE de ma requête linq (donc une ligne), je dois vérifier si datetime1 et datetime2 sont exactement les mêmes. Les valeurs datetime considérées sont des dates de cachet pour les autres valeurs utilisées dans la requête.

+0

Comme modifié dans ma réponse, il suffit d'utiliser dateTime1 == dateTime2. S'il vous plaît mettez à jour votre question pour se débarrasser de l'utilisation "jusqu'à une précision minute" car ce n'est pas la même chose que "exactement la même chose". –

Questions connexes