web-dev-qa-db-fra.com

Comment comparer uniquement les types Date sans heure dans DateTime dans Linq to SQL avec Entity Framework?

Existe-t-il un moyen de comparer 2 variables DateTime dans Linq2Sql sans ignorer la partie Time?.

L'application stocke des éléments dans la base de données et ajoute une date publiée. Je veux garder l'heure exacte, mais toujours pouvoir tirer par la date elle-même.

Je veux comparer 12/3/89 12:43:34 et 12/3/89 11:22:12 et ne pas tenir compte de l'heure réelle de la journée, donc les deux sont 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 souhaite en fait connaître l'heure à laquelle je souhaite simplement pouvoir comparer par date uniquement.

J'ai trouvé un code qui a le même problème et ils comparent l'année, le mois et le jour séparément. Y a-t-il une meilleure manière de faire cela?

271
Sruly

essayez d'utiliser la propriété Date sur l'objet DateTime ...

if(dtOne.Date == dtTwo.Date)
    ....
479
Quintin Robinson

Pour une vraie comparaison, vous pouvez utiliser:

dateTime1.Date.CompareTo(dateTime2.Date);
57
Reed Copsey

Voici comment je le fais pour pouvoir 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, cela ne fonctionnera pas avec LINQ (Erreur: le membre de type spécifié 'Date' n'est pas pris en charge dans LINQ to Entities)

36
Alejandro del Río

Si vous utilisez Entity Framework <v6.0, utilisez EntityFunctions.TruncateTime Si vous utilisez Entity Framework> = v6.0, utilisez DbFunctions.TruncateTime

Utilisez l'une ou l'autre (en fonction de votre version EF) autour de la propriété de classe DateTime que vous souhaitez utiliser dans votre requête Linq.

Exemple

var list = db.Cars.Where(c=> DbFunctions.TruncateTime(c.CreatedDate) 
                                       >= DbFunctions.TruncateTime(DateTime.UtcNow));
17
Korayem
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....");
}
12
Devarajan.T
DateTime? NextChoiceDate = new DateTime();
DateTIme? NextSwitchDate = new DateTime();
if(NextChoiceDate.Value.Date == NextSwitchDate.Value.Date)
{
Console.WriteLine("Equal");
}

Vous pouvez l'utiliser si vous utilisez DateFields nullable.

6
Code Geek
DateTime dt1=DateTime.ParseExact(date1,"dd-MM-yyyy",null);
DateTime dt2=DateTime.ParseExact(date2,"dd-MM-yyyy",null);

int cmp=dt1.CompareTo(dt2);

   if(cmp>0) {
       // date1 is greater means date1 is comes after date2
   } else if(cmp<0) {
       // date2 is greater means date1 is comes after date1
   } else {
       // date1 is same as date2
   }
3
Mohan Sharma
DateTime econvertedDate = Convert.ToDateTime(end_date);
DateTime sconvertedDate = Convert.ToDateTime(start_date);

TimeSpan age = econvertedDate.Subtract(sconvertedDate);
Int32 diff = Convert.ToInt32(age.TotalDays);

La valeur diff représente le nombre de jours pour l'âge. Si la valeur est négative, la date de début tombe après la date de fin. C'est un bon chèque.

2
dgsjr

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

0
Adam Robinson