如何比较只有日期没有时间在DateTime类型在Linq SQL与实体框架?

是否有一种方法比较Linq2Sql中的两个DateTime变量,但忽略时间部分。

应用程序将项目存储在数据库中,并添加发布日期。我想保持准确的时间,但仍然能够拉到日期本身。

我想比较12/3/89 12:43:3412/3/89 11:22:12,并让它忽略一天中的实际时间,这样它们就被认为是相同的。

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

我发现一些代码有同样的问题,他们分别比较年,月和日。还有更好的办法吗?

376988 次浏览

尝试在DateTime对象上使用Date属性…

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

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

dateTime1.Date.CompareTo(dateTime2.Date);

在join或where子句中,使用列的Date属性。在幕后,它执行一个CONVERT(DATE, <expression>)操作。这将允许您比较日期而不考虑时间。

        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))
{
}
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....");
}
DateTime econvertedDate = Convert.ToDateTime(end_date);
DateTime sconvertedDate = Convert.ToDateTime(start_date);


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

diff值表示年龄的天数。如果该值为负,则开始日期在结束日期之后。这是一张很好的支票。

为了使用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一起工作(错误:指定类型成员'Date'在LINQ to Entities中不支持)

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
}
DateTime? NextChoiceDate = new DateTime();
DateTIme? NextSwitchDate = new DateTime();
if(NextChoiceDate.Value.Date == NextSwitchDate.Value.Date)
{
Console.WriteLine("Equal");
}

如果您正在使用可为空的DateFields,则可以使用此选项。

如果你使用实体框架<v6.0,然后使用EntityFunctions.TruncateTime 如果你正在使用实体框架>= v6.0,那么使用DbFunctions.TruncateTime

在Linq查询中使用任何DateTime类属性(基于你的EF版本)

例子

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

你可以试试

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

net 5:

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

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

我知道这个问题很老了,但最好这样说:

使用

DbFunctions

在ASP。NET CORE必须创建一个对象。

var DbF = Microsoft.EntityFrameworkCore.EF.Functions;

现在你可以很容易地使用它。

var now = DateTime.Now;


int count = db.Tbl.Count(w => DbF.DateDiffDay(now, w.RegisterDate) <= 3);