382 votes

Comment comparer uniquement la date sans l'heure dans les types DateTime dans Linq to SQL avec Entity Framework ?

Existe-t-il un moyen de comparer deux DateTime variables dans Linq2Sql mais de ne pas tenir compte de la partie Time.

L'application stocke les éléments dans la base de données et ajoute une date de publication. Je veux conserver l'heure exacte mais être en mesure d'extraire la date elle-même.

Je veux comparer 12/3/89 12:43:34 y 12/3/89 11:22:12 et faire en sorte qu'il ne tienne pas compte de l'heure réelle de la journée pour que les deux soient considérés comme identiques.

Je suppose que je peux régler toutes les heures de la journée sur 00:00:00 avant de comparer, mais je veux en fait connaître l'heure de la journée, je veux juste pouvoir comparer par date uniquement.

J'ai trouvé un code qui a le même problème et qui compare l'année, le mois et le jour séparément. Existe-t-il une meilleure façon de procéder ?

654voto

Quintin Robinson Points 41988

Essayez d'utiliser le Date sur la propriété DateTime Objet...

if(dtOne.Date == dtTwo.Date)
    ....

37 votes

Si vous vous retrouvez ici quelque temps après le début de 2017 à la recherche d'un moyen de comparer des dates dans un environnement Entity Framework comme je l'ai fait, consultez la réponse ci-dessous par Alejandro et le commentaire de wasatchWizard.

14 votes

Si vous vous retrouvez ici quelque part après la mi 2018 à la recherche d'un moyen de lire un autre commentaire extrêmement utile comme celui ci-dessus, vous n'avez pas de chance.

16 votes

Si vous vous retrouvez ici après le début de l'année 2019 à la recherche d'un soulagement comique, vous l'avez trouvé.

65voto

Reed Copsey Points 315315

Pour une véritable comparaison, vous pouvez utiliser :

dateTime1.Date.CompareTo(dateTime2.Date);

0 votes

Est-ce que "==" ne renvoie pas les résultats de CompareTo en interne ?

19 votes

Qu'entendez-vous exactement par "comparaison réelle" ?

0 votes

SnOrfus : Pas toujours. De nombreuses implémentations renvoient a.CompareTo(b)==0 pour ==, mais cela dépend de l'implémentation. Je n'ai pas vérifié l'implémentation interne de l'égalité dans DateTime.

63voto

Voici comment je procède afin de travailler avec LINQ.

DateTime date_time_to_compare = DateTime.Now;
//Compare only date parts
context.YourObject.FirstOrDefault(r =>
                EntityFunctions.TruncateTime(r.date) == EntityFunctions.TruncateTime(date_to_compare));

Si vous utilisez uniquement dtOne.Date == dtTwo.Date il ne fonctionne pas avec LINQ (Error : Le membre de type spécifié 'Date' n'est pas supporté dans LINQ to Entities)

33 votes

Cela fonctionne très bien avec LINQ to Entities. Cependant, EntityFunctions a été déprécié dans .NET 4.5.2. Utilisez ceci à la place : DbFunctions.TruncateTime . Il semble que ce soit la même méthode, juste déplacée

0 votes

Celle-ci devrait être une réponse acceptée.

12voto

Devarajan.T Points 39
DateTime dt1 = DateTime.Now.Date;
DateTime dt2 = Convert.ToDateTime(TextBox4.Text.Trim()).Date;
if (dt1 >= dt2)
{
    MessageBox.Show("Valid Date");
}
else
{
    MessageBox.Show("Invalid Date... Please Give Correct Date....");
}

0voto

Adam Robinson Points 88472

Dans votre clause jointe ou where, utilisez le Date de la colonne. En coulisse, cela exécute un CONVERT(DATE, <expression>) opération. Cela devrait vous permettre de comparer les dates sans l'heure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X