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

时间:2009-03-25 19:17:43

标签: c# .net database entity-framework linq-to-sql

有没有办法比较Linq2Sql中的2个DateTime变量,但忽略了Time部分。

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

我想比较12/3/89 12:43:34和12/3/89 11:22:12然后忽略实际的时间,所以这些都被认为是相同的。

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

我找到了一些具有相同问题的代码,他们分别比较年,月和日。有更好的方法吗?

13 个答案:

答案 0 :(得分:470)

尝试使用Date对象上的DateTime属性...

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

答案 1 :(得分:56)

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

dateTime1.Date.CompareTo(dateTime2.Date);

答案 2 :(得分:36)

我这样做是为了使用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')

答案 3 :(得分:15)

如果您正在使用实体框架< v6.0,然后使用EntityFunctions.TruncateTime 如果您使用的是Entity Framework> = v6.0,请使用DbFunctions.TruncateTime

在您想要在Linq查询中使用的任何DateTime类属性周围使用(基于您的EF版本)

实施例

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

答案 4 :(得分: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....");
}

答案 5 :(得分:5)

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

如果您使用可以为空的DateFields,则可以使用此方法。

答案 6 :(得分:4)

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
   }

答案 7 :(得分: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值表示年龄的天数。如果值为负,则开始日期在结束日期之后。这是一个很好的检查。

答案 8 :(得分:1)

您可以使用等于 CompareTo

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

比较返回值

  1. 小于零:如果此实例早于value。
  2. :如果此实例与value相同。
  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;
}

答案 9 :(得分:0)

在您的join或where子句中,使用列的Date属性。在幕后,这将执行CONVERT(DATE, <expression>)操作。这应该允许您在没有时间的情况下比较日期。

答案 10 :(得分:0)

您可以尝试

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

答案 11 :(得分:0)

.NET 5 中:

要在没有时间的情况下比较日期,您必须使用 EF.Functions.DateDiffDay() 否则您将在代码中进行比较,这意味着您从数据库中提取的数据可能比您需要的多。

.Where(x => EF.Functions.DateDiffDay(x.ReceiptDate, value) == 0);

答案 12 :(得分:-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))
        {
        }