Linq在日期之间查询

时间:2015-06-05 08:39:20

标签: c# linq date

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返回

3 个答案:

答案 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