日期之间的 Linq 查询

本文关键字:查询 Linq 之间 日期 | 更新日期: 2023-09-27 17:53:41

if ((!(searchStartDate == default(DateTime))) && (!(searchEndDate == default(DateTime))))
{
    requests = requests.Where(x => x.CreatedDate >= searchStartDate && x.CreatedDate <= searchEndDate);
}

当我尝试使用searchEndDate搜索时,不包括日期

例如。当开始日期

日期之间的 Linq 查询

为 14/4/15 且结束日期为 14/4/15 时,不会返回任何结果,但当开始日期为 14/4/15 且结束日期为 15/4/15 时,将返回 14/4/15 的结果

我强烈怀疑问题是您的开始日期和结束日期值是完全相同的时间点 - 因此只会找到该确切时间点的值

例如,假设您有:

searchStartDate: 2015-04-15T00:00:00
searchEndDate: 2015-04-15T00:00:00
Sample CreatedDate: 2015-04-15T12:34:56

然后CreatedDate不会落在searchStartDatesearchEndDate之间。你真的把它想成:

// 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