从查询中的日期时间中删除时间
Remove time from Date Time in Query
在我的网络应用程序中,我只想显示 2 天前从“'DateTime.Today'”记录的数据。
获取我尝试过的 2 天前的日期
DateTime twoDaysAgo = DateTime.Today.AddDays(-2);
然后在查询
smcNews = (from n in db.NewsShare
join e in db.CreateEmployee on n.Created_By equals e.Id join d in db.CreateDepartment on e.DepId equals d.Id
where n.CreatedDate > twoDaysAgo && n.CreatedDate <= DateTime.Today
select new NewsShareViewModel {
Id = n.Id,
UserName = e.EmpName,
Department = d.Department,
Message = n.Comment,
UserId = n.Created_By,
CreatedDate = n.CreatedDate.ToString()
}).ToList();
它不会 return 数据。我检查了 twoDaysAgo
的值,它就像 {12/29/2021 12:00:00 AM}
CreatedDate
中的数据是2021-12-31 13:43:19.957
所以我有什么方法可以通过从日期中删除时间或其他方式来正确查询吗?
n.CreatedDate <= DateTime.Today
实际上是 n.CreatedDate <= 2021-12-31 00:00:00
.
the data in the CreatedDate is 2021-12-31 13:43:19.957
2021-12-31 13:43:19.957
的日期时间不“小于或等于”2021-12-31 00:00:00
删除 && n.CreatedDate <= DateTime.Today
条件 - 它对您没有任何作用(除了排除您今天创建的任何数据),假设将来无法创建记录,并假设您希望从两天午夜开始创建所有记录以前
I there any way to get this query right by removing the time from the date or something ?
尽可能避免这样做;当您在一个范围内搜索数据时,旨在始终使用一系列固定常量值 from/to。
不要在 Where 子句中操作 table 数据,除非您想创建不能使用索引的查询(并因此成为性能问题)
日期时间总是包含时间。你无法避免这一点。
如果您的开始日期是 29 日,这意味着您的 Today
值是 31 日午夜。 2021-12-31 13:43:19.957
已过午夜,因此超出了您指定的范围。
相反,使用第二天(1 号午夜)作为上限。
DateTime start = DateTime.Today.AddDays(-2); //29th
DateTime end = DateTime.Today.AddDays(1); //1st
然后过滤使用:
where n.CreatedDate >= start && n.CreatedDate < end
注意 >=
和 <
的用法。这确保包括 29 日、30 日和 31 日的所有内容;但从一开始就没有了。
您将无法将 n.CreatedDate.Date
与 EF 一起使用。我猜您使用的是 .Net Framework 的 EF 版本 DateTime.Date is supported in EF Core
你应该使用 DbFunctions.TruncateTime
.
DbFunctions.TruncateTime(n.CreatedDate) >= twoDaysAgo &&
DbFunctions.TruncateTime(n.CreatedDate) <= DateTime.Today
更新 - 不要这样做 - 与正确范围查询相比,它会相对较慢
在我的网络应用程序中,我只想显示 2 天前从“'DateTime.Today'”记录的数据。
获取我尝试过的 2 天前的日期
DateTime twoDaysAgo = DateTime.Today.AddDays(-2);
然后在查询
smcNews = (from n in db.NewsShare
join e in db.CreateEmployee on n.Created_By equals e.Id join d in db.CreateDepartment on e.DepId equals d.Id
where n.CreatedDate > twoDaysAgo && n.CreatedDate <= DateTime.Today
select new NewsShareViewModel {
Id = n.Id,
UserName = e.EmpName,
Department = d.Department,
Message = n.Comment,
UserId = n.Created_By,
CreatedDate = n.CreatedDate.ToString()
}).ToList();
它不会 return 数据。我检查了 twoDaysAgo
的值,它就像 {12/29/2021 12:00:00 AM}
CreatedDate
中的数据是2021-12-31 13:43:19.957
所以我有什么方法可以通过从日期中删除时间或其他方式来正确查询吗?
n.CreatedDate <= DateTime.Today
实际上是 n.CreatedDate <= 2021-12-31 00:00:00
.
the data in the CreatedDate is 2021-12-31 13:43:19.957
2021-12-31 13:43:19.957
的日期时间不“小于或等于”2021-12-31 00:00:00
删除 && n.CreatedDate <= DateTime.Today
条件 - 它对您没有任何作用(除了排除您今天创建的任何数据),假设将来无法创建记录,并假设您希望从两天午夜开始创建所有记录以前
I there any way to get this query right by removing the time from the date or something ?
尽可能避免这样做;当您在一个范围内搜索数据时,旨在始终使用一系列固定常量值 from/to。
不要在 Where 子句中操作 table 数据,除非您想创建不能使用索引的查询(并因此成为性能问题)
日期时间总是包含时间。你无法避免这一点。
如果您的开始日期是 29 日,这意味着您的 Today
值是 31 日午夜。 2021-12-31 13:43:19.957
已过午夜,因此超出了您指定的范围。
相反,使用第二天(1 号午夜)作为上限。
DateTime start = DateTime.Today.AddDays(-2); //29th
DateTime end = DateTime.Today.AddDays(1); //1st
然后过滤使用:
where n.CreatedDate >= start && n.CreatedDate < end
注意 >=
和 <
的用法。这确保包括 29 日、30 日和 31 日的所有内容;但从一开始就没有了。
您将无法将 n.CreatedDate.Date
与 EF 一起使用。我猜您使用的是 .Net Framework 的 EF 版本 DateTime.Date is supported in EF Core
你应该使用 DbFunctions.TruncateTime
.
DbFunctions.TruncateTime(n.CreatedDate) >= twoDaysAgo &&
DbFunctions.TruncateTime(n.CreatedDate) <= DateTime.Today
更新 - 不要这样做 - 与正确范围查询相比,它会相对较慢