【问题标题】:Linq query between dates日期之间的Linq查询
【发布时间】:2015-06-05 08:39:19
【问题描述】:
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 时,结果15 年 4 月 14 日返回

【问题讨论】:

  • 请记住,像2015-04-14 这样的日期实际上是2015-04-14T00:00:00。因此,如果开始日期和结束日期是同一时间,则您要求的所有记录恰好是午夜,而不是一天中的全部时间。

标签: c# linq date


【解决方案1】:

我强烈怀疑问题在于您的开始日期值和结束日期值是完全相同的时间点 - 所以只有 at 的值才会被找到。

例如,假设您有:

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 是broken model,所以你不能用类型系统来表示。相反,您基本上需要手动完成:

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,但这可能效率较低,因为它实际上涉及对每个存储值的计算——而我的方法是对边界执行一次计算,而不是一次。

【讨论】:

    【解决方案2】:

    如果您只对日期感兴趣,那么您应该纯粹搜索它们,此时您的搜索也将包括时间

    x.CreatedDate.Date >= searchStartDate.Date && x.CreatedDate.Date <= searchEndDate.Date
    

    这是一个示例,说明您当前检查失败的原因 - 假设您没有在 searchStartDate/searchEndDate 上设置特定时间,那么它将默认为 12:00:00,因此您的开始和结束日期实际上是 @987654326 @。在这种情况下,除非您有一个 完全 与 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 的查询不会包含此日期。

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      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。

      【讨论】:

      • 虽然有点脏。我只是想知道为什么它不起作用。
      • @LukeOsborne 它不起作用,因为x.CreatedDate 可能是大于14/4/15 00:00:00.000 的14/4/15 10:00:00.000。
      猜你喜欢
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      相关资源
      最近更新 更多