【问题标题】:Remove time from Date Time in Query从查询中的日期时间中删除时间
【发布时间】:2021-12-31 17:40:41
【问题描述】:

在我的 Web 应用程序中,我只想显示 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();

它不会返回数据。我检查了twoDaysAgo 的值,它就像{12/29/2021 12:00:00 AM}

CreatedDate 中的数据是2021-12-31 13:43:19.957

所以我有什么方法可以通过从日期中删除时间或其他什么来正确查询?

【问题讨论】:

  • n.CreatedDate.Date 不起作用吗?
  • @Llama 不。当它添加时,我得到了这个错误The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
  • 你在使用实体框架吗?
  • @phuzi 是的。代码在控制器内
  • 如果您使用的是 LINQ to SQL 或 EF,请记得提及 :) 如果您只是使用代码查询 List&lt;something&gt; 等,肯定不会出现错误。

标签: c# entity-framework


【解决方案1】:

n.CreatedDate &lt;= DateTime.Today 实际上是n.CreatedDate &lt;= 2021-12-31 00:00:00

CreatedDate 中的数据是 2021-12-31 13:43:19.957

2021-12-31 13:43:19.957 的日期时间不是“小于或等于”2021-12-31 00:00:00

删除&amp;&amp; n.CreatedDate &lt;= DateTime.Today 条件 - 它对您没有任何作用(除了排除您今天创建的任何数据),假设将来无法创建记录,并假设您希望创建自两天前午夜以来的所有记录

我有什么方法可以通过从日期中删除时间或其他什么来正确查询?

尽可能避免这样做;当您在某个范围内搜索数据时,力求始终使用一系列固定常数值 from/to。

不要在 Where 子句中操作表数据,除非您想创建不能使用索引的查询(并因此成为性能问题)

【讨论】:

    【解决方案2】:

    日期时间总是包含时间。这是你无法避免的。

    如果您的开始日期是 29 日,这意味着您的 Today 值是 31 日午夜。 2021-12-31 13:43:19.957 是在午夜之后,所以它不在您指定的范围内。

    改为使用第二天(午夜的第一天)作为上限。

    DateTime start = DateTime.Today.AddDays(-2); //29th
    DateTime end = DateTime.Today.AddDays(1);    //1st
    

    然后过滤使用:

    where n.CreatedDate >= start && n.CreatedDate < end
    

    注意&gt;=&lt; 的使用。这确保包括 29 日、30 日和 31 日的所有内容;但从一开始就没有。

    【讨论】:

    • 我试过了,但仍然无法获取数据。创建日期中的日期时间格式为2021-12-31 13:43:19.957,开始中的日期时间格式为12/29/2021 12:00:00 AM,格式不匹配。会不会有问题?
    【解决方案3】:

    您将无法将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
    

    更新 - 不要这样做 - 与正确排列查询相比,它会相对较慢

    【讨论】:

    • 不,不要操纵表数据来满足可以通过更合理指定范围同样容易满足的条件
    • @phuzi 它的 ef 版本,适用于 net framework 4.7。
    • @CaiusJard 好点,那样会更高效。
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2018-08-20
    • 2017-07-10
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多