【问题标题】:Make a Query Expression ignore the Time and filter only the Date使查询表达式忽略时间并仅过滤日期
【发布时间】:2014-08-08 17:27:52
【问题描述】:

我想写一个查询表达式来返回一些在日期范围内过滤的记录,并忽略时间。

开始日期和结束日期可能会匹配(一天的结果)。 EF 似乎总是将时间附加到生成的 SQL 查询中,这让我抓狂。

在使用带有 EF 的查询表达式时,是否有办法指示在过滤 DateTime 时忽略 Time 组件?

表达式查询:

searchQuery = searchQuery.Where(currentQuery => currentQuery.Ticket.th_TicketDate >= startDate && currentQuery.Ticket.th_TicketDate <= endDate);

执行此操作返回 0 个结果,因为 EF 包含时间 00:00:00,如下所示:

Select * from t_TicketHeader
Where th_TicketDate >= '2014-08-01 00:00:00' 
AND th_TicketDate <= '2014-08-01 00:00:00'

而如果我直接编写并运行自己的 SQL 查询(将结束日期提前一天):

Select * from t_TicketHeader
Where th_TicketDate >= '2014-08-01' 
AND th_TicketDate <= '2014-08-02'

我检索到我的 2 个预期结果:

th_TicketNumber  th_TicketDate
OT01938332       2014-08-01 06:00:00.000
OT01938333       2014-08-01 06:00:00.000

我目前的解决方案是改变我的日期标准,将时间推到一天结束,但这个解决方案似乎有点hacky

startDate = new DateTime(searchCriteria.StartDate.Year, searchCriteria.StartDate.Month, searchCriteria.StartDate.Day);
endDate = new DateTime(searchCriteria.EndDate.Year, searchCriteria.EndDate.Month, searchCriteria.EndDate.Day, 23, 59, 59);

【问题讨论】:

  • hacky 解决方案通常是 sql 日期时间的最佳解决方案。包括您的解决方案。我认为按照您提到的方式进行操作没有任何问题。
  • sql函数怎么能正常工作,如果sql把开始日期2014-08-01当作2014-08-01 00:00:00,那么结束日期应该和2014-08-01 00:00:00一样,反之亦然
  • 很好,我写错了日期。我澄清了。如果我将结束日期提前一天,我会得到预期的结果。困惑在于,似乎无论如何,总有一个时间……我这样说对吗?
  • 不确定sql如何处理没有时间的日期,没有找到任何参考

标签: c# linq entity-framework datetime linq-to-entities


【解决方案1】:

这个怎么样,关键是修改结束日期。

var formattedEndDate = endDate.Date.AddDays(1).AddMilliseconds(-1);
searchQuery = searchQuery.Where(currentQuery => 
    currentQuery.Ticket.th_TicketDate >= startDate.Date 
    && currentQuery.Ticket.th_TicketDate <= formattedEndDate);

或者

var formattedEndDate = endDate.Date.AddDays(1);
searchQuery = searchQuery.Where(currentQuery => 
    currentQuery.Ticket.th_TicketDate >= startDate.Date 
    && currentQuery.Ticket.th_TicketDate < formattedEndDate);
                                     // ^^^ remove the equal sign

【讨论】:

    【解决方案2】:

    您可以使用DbFunctions.TruncateTime

    【讨论】:

    • 我刚试了一下,用profiler检查了,00:00:00还是出现了,但是又出现了一个sql函数,这个可能行,(convert (datetime2, convert(varchar(255), @p__linq__0, 102) , 102))
    • 是的,我也试了一下,没有运气。
    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2019-10-02
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多