如何仅将Linq中DateTime类型中的没有日期的Date与带有实体框架的SQL进行比较?


303

有没有一种方法可以比较两个DateTime变量,Linq2Sql但是可以忽略“时间”部分。

该应用程序将项目存储在数据库中并添加发布日期。我想保留确切的时间,但仍然可以按时完成日期。

我想进行比较12/3/89 12:43:3412/3/89 11:22:12而忽略了一天中的实际时间,因此两者都被认为是相同的。

我想我可以将一天中的所有时间都设置为00:00:00比较之前,但实际上我确实想知道一天中的时间,我也只想按日期进行比较。

我发现一些具有相同问题的代码,它们分别比较年,月和日。有一个更好的方法吗?

Answers:


534

尝试DateDateTime对象上使用属性...

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

25
如果您在2017年初后的某个时间结束工作,那么您会在Entity Framework环境中寻找一种比较日期的方法,例如我确实查看了Alejandro的以下答案和wasatchWizard的评论。
Mike Devenney '17

8
如果您在2018年年中之后的某个时候结束在这里的生活,并且正在寻找一种方法来阅读另一条非常有帮助的评论,例如上面的评论,那您就不走运了。
nardnob

4
如果您在2019年初之后的某个时间到这里寻找漫画救济,那么您已经找到了。
菲尔·林格斯

1
这绝对不是正确的答案。OP专门在linq表达式中不允许SQL和datetime.date表示Linq。
菲利普·沃恩

2
如果您在2020年初之后的某个时候结束在这里的生活,希望您在照顾自己并在冠状病毒大流行危机期间呆在家里。2021年回到这里!
奥特先生

61

为了进行真正的比较,您可以使用:

dateTime1.Date.CompareTo(dateTime2.Date);

18
“真正的比较”到底是什么意思?
Randolpho

6
Randolpho:使用==将使您具有相等性,因此两个日期是相同还是不同。CompareTo将比较它们,即:通过一种方法告诉您date1> date2,date1 <date2或date1 == date2。
里德·科普西

6
@ReedCopsey不能只使用(dateTime1.Date <dateTime1.Date)吗?
大卫

14
但是,谁愿意-10而且1,真的吗?它们只是代表“更少”,“相等”和“更大”的神奇数字。然后,您将必须将所得的整数“比较”为某些东西,因为存在三个可能的值。我必须用@大卫同意,这是更自然的使用dateTime1.Date < dateTime1.Date,同样有<=>而且>=,在大多数应用中。
Jeppe Stig Nielsen

8
@JeppeStigNielsen如果您在排序或使用同位格的任何事物中使用此功能,则需要它-否则,通常只需要运算符。
里德·科普西2014年

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 to Entities不支持指定的类型成员'Date')


22
这对于LINQ to 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。
curiousBoy

这应该是正确的答案(截至2019年)。EntityFunctions已贬值,并且您不允许在lambda表达式中使用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");
}

如果您使用的是可为空的DateField,则可以使用它。


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值表示该年龄段的天数。如果该值为负,则开始日期位于结束日期之后。这是一个很好的检查。


0

在联接或where子句中,使用Date列的属性。在后台执行CONVERT(DATE, <expression>)操作。这样可以让您比较没有时间的日期。


0

您可以使用EqualsCompareTo

等于:返回一个值,该值指示两个DateTime实例是否具有相同的日期和时间值。

CompareTo返回值

  1. 小于零:如果此实例早于value。
  2. :如果此实例与value相同。
  3. 大于零:如果此实例晚于value。

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

你可以试试

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上看到的代码。
威廉·赫斯特

无需创建这么多的变量,因为它增加了完成如此简单任务的响应时间。
Nayan Katkani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.