Як порівняти лише Дата без часу в типах DateTime в Linq та SQL з Entity Framework?


303

Чи є спосіб порівняти дві DateTimeзмінні, Linq2Sqlале нехтувати частиною часу.

Додаток зберігає елементи в БД і додає опубліковану дату. Я хочу тримати точний час, але все-таки зможу підтягуватись до самої дати.

Я хочу порівнювати, 12/3/89 12:43:34і 12/3/89 11:22:12це не враховує фактичний час доби, тому обидва вони вважаються однаковими.

Я думаю, що я можу встановити всі дні доби, 00:00:00перш ніж порівнювати, але я насправді хочу знати час доби, я просто хочу також мати можливість порівнювати лише за датою.

Я знайшов якийсь код, який має однакову проблему, і вони порівнюють рік, місяць і день окремо. Чи є кращий спосіб зробити це?

Відповіді:


534

спробуйте використовувати Dateвластивість на DateTimeObject ...

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

25
Якщо ви закінчилися тут, десь після початку 2017 року, шукаючи спосіб порівняння дат у середовищі Entity Framework, як я перевірив відповідь Алехандро нижче та коментар wasatchWizard.
Майк Девенні

8
Якщо ви опинитесь десь після середини 2018 року і шукаєте спосіб прочитати ще один надзвичайно корисний коментар, як той, що вище, вам не пощастило.
нардноб

4
Якщо ви закінчилися десь після початку 2019 року, шукаючи комічне полегшення, ви знайшли його.
Філ Рінгсмут

1
Це абсолютно НЕ правильна відповідь. ОП спеціально сказав, що Linq для SQL та datetime.date НЕ дозволено у виразах linq.
Філіп Вон

2
Якщо ви закінчитеся тут десь після початку 2020 року, я сподіваюся, що ви дбаєте про себе і залишаєтесь вдома під час криз пандемії коронавірусу. Поверніться сюди в 2021 році!
Містер Отт

61

Для справжнього порівняння ви можете використовувати:

dateTime1.Date.CompareTo(dateTime2.Date);

18
Що саме ви маєте на увазі під «справжнім порівнянням»?
Рандольфо

6
Рандольфо: Використання == дасть вам рівність, тож, чи є дві дати однакові чи різні. Порівняйте, щоб ~ порівнювати ~ їх, тобто: дайте вам за один прохід сказати, чи дата1> дата2, дата1 <дата2 або дата1 == дата2.
Рід Копсі

6
@ReedCopsey Ви не можете просто використовувати (dateTime1.Date <dateTime1.Date)?
Девід

14
Але хто хоче -1, 0і 1, справді? Вони просто магічні числа, що представляють "менше", "рівне" та "більше". І вам доведеться "порівняти" отримане ціле число з чимось згодом, оскільки є три можливі значення. Я повинен погодитися з @David , що це набагато природніше використовувати dateTime1.Date < dateTime1.Date, а так само з <=, >і >=, в більшості додатків.
Джеппе Стіг Нільсен

8
@JeppeStigNielsen Якщо ви використовуєте це в будь-якому, що сортує або займає компанію, то ви цього хочете - інакше, як правило, ви просто хочете операторів.
Рід Копсі

45

Ось так я це роблю для того, щоб працювати з 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));

Якщо ви лише використовуєте dtOne.Date == dtTwo.Dateйого, ви не працюєте з LINQ (помилка: вказаний тип типу "Дата" не підтримується в LINQ для сутностей)


22
Це чудово працює з LINQ для Entities. Однак EntityFunctionsу .NET 4.5.2 застаріло. Натомість використовуйте: DbFunctions.TruncateTime. Схоже, це той самий метод, щойно переміщений ..
wasatchwizard

25

Якщо ви використовуєте Entity Framework <v6.0, тоді використовуйте EntityFunctions.TruncateTime Якщо ви використовуєте Entity Framework> = v6.0, тоді використовуйтеDbFunctions.TruncateTime

Використовуйте або (на основі вашої версії EF) навколо будь-якого DateTimeкласу властивостей, які ви хочете використовувати всередині вашого запиту Linq

Приклад

var list = db.Cars.Where(c=> DbFunctions.TruncateTime(c.CreatedDate) 
                                       >= DbFunctions.TruncateTime(DateTime.UtcNow));

Тут лише нагадування: Поки це Linq to Entity.
цікавоБой

Це має бути правильна відповідь (станом на 2019 рік). EntityFunctions знецінюється, і вам заборонено використовувати datetime.date у лямбда-виразі (з будь-якої причини - я маю на увазі серйозно ... чому вони не виправили це ?!).
Філіп Вон

12
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....");
}

9
DateTime? NextChoiceDate = new DateTime();
DateTIme? NextSwitchDate = new DateTime();
if(NextChoiceDate.Value.Date == NextSwitchDate.Value.Date)
{
Console.WriteLine("Equal");
}

Ви можете використовувати це, якщо ви використовуєте зведені поля дат.


3
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
   }

2
DateTime econvertedDate = Convert.ToDateTime(end_date);
DateTime sconvertedDate = Convert.ToDateTime(start_date);

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

Значення diff представляє кількість днів для віку. Якщо значення негативне, дата початку падає після закінчення дати. Це хороша перевірка.


1

Ви можете використовувати Equals або CompareTo .

Дорівнює : Повертає значення, яке вказує, чи мають два екземпляри DateTime однакове значення дати та часу.

ПорівняйтеЗа поверненням значення :

  1. Менше нуля : Якщо цей екземпляр раніше значення.
  2. Нуль : Якщо цей екземпляр збігається з значенням.
  3. Більше нуля : Якщо цей екземпляр пізніше значення.

DateTime є нульовим:

DateTime? first = new DateTime(1992,02,02,20,50,1);
DateTime? second = new DateTime(1992, 02, 02, 20, 50, 2);

if (first.Value.Date.Equals(second.Value.Date))
{
    Console.WriteLine("Equal");
}

або

DateTime? first = new DateTime(1992,02,02,20,50,1);
DateTime? second = new DateTime(1992, 02, 02, 20, 50, 2);


var compare = first.Value.Date.CompareTo(second.Value.Date);

switch (compare)
{
    case 1:
        Console.WriteLine("this instance is later than value.");
        break;
    case 0:
        Console.WriteLine("this instance is the same as value.");
        break;
    default:
        Console.WriteLine("this instance is earlier than value.");
        break;
}

DateTime не зводиться до нуля:

DateTime first = new DateTime(1992,02,02,20,50,1);
DateTime second = new DateTime(1992, 02, 02, 20, 50, 2);

if (first.Date.Equals(second.Date))
{
    Console.WriteLine("Equal");
}

або

DateTime first = new DateTime(1992,02,02,20,50,1);
DateTime second = new DateTime(1992, 02, 02, 20, 50, 2);


var compare = first.Date.CompareTo(second.Date);

switch (compare)
{
    case 1:
        Console.WriteLine("this instance is later than value.");
        break;
    case 0:
        Console.WriteLine("this instance is the same as value.");
        break;
    default:
        Console.WriteLine("this instance is earlier than value.");
        break;
}

0

У пункті приєднання або де використовуйте Dateвластивість стовпця. За кадром це виконує CONVERT(DATE, <expression>)операцію. Це повинно дозволяти вам порівнювати дати без часу.


0

Ви можете спробувати

if(dtOne.Year == dtTwo.Year && dtOne.Month == dtTwo.Month && dtOne.Day == dtTwo.Day)
  ....

-16
        int o1 = date1.IndexOf("-");
        int o2 = date1.IndexOf("-",o1 + 1);
        string str11 = date1.Substring(0,o1);
        string str12 = date1.Substring(o1 + 1, o2 - o1 - 1);
        string str13 = date1.Substring(o2 + 1);

        int o21 = date2.IndexOf("-");
        int o22 = date2.IndexOf("-", o1 + 1);
        string str21 = date2.Substring(0, o1);
        string str22 = date2.Substring(o1 + 1, o2 - o1 - 1);
        string str23 = date2.Substring(o2 + 1);

        if (Convert.ToInt32(str11) > Convert.ToInt32(str21))
        {
        }
        else if (Convert.ToInt32(str12) > Convert.ToInt32(str22))
        {
        }
        else if (Convert.ToInt32(str12) == Convert.ToInt32(str22) && Convert.ToInt32(str13) > Convert.ToInt32(str23))
        {
        }

5
-1: Чому б не просто розібратися з DateTime і не використовувати метод @Quintin Robinson? Цей код я б очікував побачити на The Daily WTF.
Вільям Херст

Не потрібно створювати стільки змінних, оскільки це збільшує час відповіді на таке просте завдання.
Найян Каткані
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.