if ((!(searchStartDate == default(DateTime))) && (!(searchEndDate == default(DateTime))))
{
requests = requests.Where(x => x.CreatedDate >= searchStartDate && x.CreatedDate <= searchEndDate);
}
当我尝试使用searchEndDate
进行搜索时,日期不包含在内
例如。)当开始日期是14/4/15且结束日期是14/4/15时,不会返回结果,但是当开始日期是14/4/15并且结束日期是15/4/15结果时将于14/4/15返回
答案 0 :(得分:4)
我强烈怀疑问题是您的开始日期和结束日期值是完全相同的时间点 - 因此只有 的确切时间点的值才会被找到。
例如,假设你有:
searchStartDate: 2015-04-15T00:00:00
searchEndDate: 2015-04-15T00:00:00
Sample CreatedDate: 2015-04-15T12:34:56
然后CreatedDate
不在<{1}}和searchStartDate
之间。你真的把它想象成:
searchEndDate
但由于// Look ma, no time of day!
searchStartDate: 2015-04-15
searchEndDate: 2015-04-15
是broken model,因此您无法使用类型系统指明。相反,你基本上需要手工完成:
DateTime
您也可以在查询中使用if (searchStartDate != default(DateTime) && searchEndDate != default(DateTime))
{
// Include the *whole* of the day indicated by searchStartDate
DateTime inclusiveStart = searchStartDate.Date;
// Include the *whole* of the day indicated by searchEndDate
DateTime exclusiveEnd = searchEndDate.Date.AddDays(1);
requests = requests.Where(x => x.CreatedDate >= inclusiveStart
&& x.CreatedDate < exclusiveEnd);
}
,但这可能效率较低,因为它实际上涉及对每个存储值的计算 - 而我的方法改为对边界执行计算,只是一次。
答案 1 :(得分:3)
如果您只对日期感兴趣,那么您应该在其上搜索纯粹,此时您的搜索也将包括时间
x.CreatedDate.Date >= searchStartDate.Date && x.CreatedDate.Date <= searchEndDate.Date
以下是您当前检查失败原因的一个示例 - 假设您没有在searchStartDate
/ searchEndDate
上设置特定时间,那么它将默认为12:00:00
,因此您的开始和放大;结束日期实际上是14/4/15 12:00:00
。在这种情况下,除非您的创建日期完全与14/4/15 12:00:00
匹配,否则您的查询将不会产生任何结果。这就是为什么当您将结束日期设置为15/4/15 12:00:00
时,您需要提取在14/4/15
上创建的记录。
UTC与本地
此外,您似乎没有提及日期的存储方式以及查询方式?如果您以UTC格式存储日期,则建议您将它们转换回当地时间以获得更准确的结果。例如,我住在英国,目前我们在BST(UTC + 1),假设(希望)您以UTC格式存储记录,在06/06/2015 00:30:00
创建的记录实际上将存储为05/06/2015 23:30:00
一旦转换为UTC。因此,除非您在搜索之前将此日期转换回本地时间,否则查询中不会包含此06/06/2015
。
答案 2 :(得分:1)
你可以试试这个:
if ((!(searchStartDate == default(DateTime))) && (!(searchEndDate == default(DateTime))))
{
requests = requests.Where(x => x.CreatedDate >= searchStartDate && x.CreatedDate < searchEndDate.AddDays(1));
}
这是因为x.CreatedDate
可能14/4/15 10:00:00.000
大于14/4/15 00:00:00.000
。