if ((!(searchStartDate == default(DateTime))) && (!(searchEndDate == default(DateTime))))
{
requests = requests.Where(x => x.CreatedDate >= searchStartDate && x.CreatedDate <= searchEndDate);
}
当我尝试使用searchEndDate
搜索时,不包括日期
例如。当开始日期
我强烈怀疑问题是您的开始日期和结束日期值是完全相同的时间点 - 因此只会找到该确切时间点的值。
例如,假设您有:
searchStartDate: 2015-04-15T00:00:00
searchEndDate: 2015-04-15T00:00:00
Sample CreatedDate: 2015-04-15T12:34:56
然后CreatedDate
不会落在searchStartDate
和searchEndDate
之间。你真的把它想成:
// Look ma, no time of day!
searchStartDate: 2015-04-15
searchEndDate: 2015-04-15
但是由于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);
}
您也可以在查询中使用.Date
,但这很可能效率较低,因为它实际上涉及对每个存储值的计算 - 而我的方法反而对边界执行计算,只需一次。
如果您只对日期感兴趣,那么您应该纯粹搜索它们,目前您的搜索也将包括时间
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
创建的内容一旦转换为UTC,实际上将存储为05/06/2015 23:30:00
。因此,除非在搜索此记录之前将此日期转换回本地时间,否则此记录不会包含在06/06/2015
查询中。
你可以试试这个:
if ((!(searchStartDate == default(DateTime))) && (!(searchEndDate == default(DateTime))))
{
requests = requests.Where(x => x.CreatedDate >= searchStartDate && x.CreatedDate < searchEndDate.AddDays(1));
}
这是因为x.CreatedDate
可能大于14/4/15 00:00:00.000
14/4/15 10:00:00.000
。