【发布时间】: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