【问题标题】:Getting records for today including all day events which span today获取今天的记录,包括今天的全天事件
【发布时间】:2024-08-18 18:20:02
【问题描述】:

我有一个约会列表,其中包含开始日期、结束日期和全天标志。

我希望能够输出当天的所有记录。

示例记录:

ID  Start,            End,             AllDay

1   27/11/2016 00:00  30/11/2016 00:00 true
2   30/11/2016 00:00  01/12/2016 00:00 true
3   30/11/2016 00:00  03/12/2016 00:00 true
4   30/11/2016 00:00  05/12/2016 00:00 true
5   01/12/2016 10:00  01/12/2016 15:00 false
6   02/12/2016 09:00  02/12/2016 11:00 false

鉴于此示例数据,并假设日期是 01/12/2016 我如何获得查询以输出以下内容:

ID  Start,            End,             AllDay

2   30/11/2016 00:00  01/12/2016 00:00 true
3   30/11/2016 00:00  03/12/2016 00:00 true
4   30/11/2016 00:00  05/12/2016 00:00 true
5   01/12/2016 10:00  01/12/2016 15:00 false

我有 2 个查询,它们都返回仅部分正确的输出:

start = DateTime.Parse(DateTime.Today.ToString("dd/MM/yyyy 00:00"));
end = DateTime.Parse(DateTime.Today.AddDays(1).ToString("dd/MM/yyyy 00:00"));

var schedule = entity.Schedule.Where(x => x.Start >= start && x.End <= end && !x.AllDay)
                              .OrderBy(x => x.Start)
                              .ToList();

var alldays = entity.Schedule.Where(x => x.Start <= start && x.End => start && x.AllDay)
                             .OrderBy(x => x.Start)
                             .ToList()

【问题讨论】:

  • 多近?你得到什么输出?
  • 你能发布你的结果吗?开放式问题:为什么要将 DateTime 序列化为 String 以将其解析回 DateTime?如果您将日期与 = 进行比较,为什么要在相关日期(当前:今天)中添加一天?您不会删除 .AddDays 或更改与 x.End 的比较并删除 =(小于、不小于或等于)吗?
  • 睡在上面,稍作调整,得到了我预期的结果。

标签: c# linq date


【解决方案1】:
var events= entity.Schedule.Where((
                x => x.Start <= start && x.End => start) || x.AllDay)
                .OrderBy(x => x.Start)
                .ToList();

以上对你有用

【讨论】:

  • 不会返回 every 安排为“全天”的条目,无论那一天可能是什么?老实说,我认为 AllDay 标志与这个问题的目的完全无关(除非 OP 澄清他们想要什么)。
  • 这不起作用,因为它会返回所有设置了 AllDay 标志的东西。
【解决方案2】:

我认为您想确保它在时间表的日期部分内。

var events = entity.Schedule
    .Where(x => x.Start.Date <= start.Date && start.Date <= x.End.Date)
    .OrderBy(x => x.Start)
    .ThenBy(x => x.End)
    .ToList()

【讨论】:

    【解决方案3】:

    如果我理解正确,你有一个范围列表,如果它们达到另一个范围,你想过滤它们。由于您比较了两个范围,因此可能会发生多种可能性:

    1. 两个范围不相互接触

      |---candidate---|
                          |---filter---|
      
    2. 候选的结尾匹配过滤器的开头

      |---candidate---|
                      |---filter---|
      
    3. 候选的结尾落在过滤器内

      |---candidate---|
                    |---filter---|
      
    4. 候选封装过滤器

      |---candidate---|
        |---filter---|
      
    5. 候选者与过滤器完全匹配

      |---candidate---|
      |----filter-----|
      
    6. 候选人落入筛选条件

        |---candidate---|
      |------filter-------|
      
    7. 候选人的开头落在过滤器内

         |---candidate---|
      |---filter---|
      
    8. 候选的开头匹配过滤器的结尾

                   |---candidate---|
      |---filter---|
      

    请说明您希望看到哪些可能性,哪些不喜欢。有些情况很容易回答(如 1、5 和 6),但所有其他情况实际上取决于具体的用例。所以请告诉我们应该匹配哪些情况,我们可以创建所需的 where 子句。

    【讨论】: