【问题标题】:How to compare just month and day from a datetime object如何比较日期时间对象的月份和日期
【发布时间】:2017-04-23 00:10:34
【问题描述】:

在我的 C# 程序中,我遇到了一个障碍,我有一个存储日期范围的表(列是日期范围 ID (int)、开始日期 (DateTime) 和结束日期 (DateTime)。我想查询表并取回仅在特定日期范围内的行。我不能使用 datetime.date,因为它包括年份。

例如,我想查询表并获取介于 01-01 和 5-31 之间的所有日期范围。

我曾尝试使用以下 lambda 查询表,但我的结果集为空。

List<DateRanges> tempDateRangeList = dataContext
                                     .DateRanges
                                     .Where(r=>r.BeginDate.Month <= startDate.Month 
                                               && r.EndDate.Month >= finishDate.Month)
                                     .ToList();

tempDateRangeList = tempDateRangeList.Where(r=>r.BeginDate.Day <= startDate.Day 
                                               && r.EndDate.Day >= finishDate.Day)
                                     .ToList();

有没有人对我如何做到这一点有任何建议?

编辑:

BeginDate 和 EndDate 的示例如下:

开始日期 2016 年 1 月 1 日、2016 年 5 月 25 日、2016 年 9 月 11 日

结束日期 2016 年 5 月 24 日、2016 年 9 月 10 日、2016 年 12 月 31 日

过滤日期为: 开始日期 = 12/8 完成日期 = 12/12

预期结果: 9/11 开始日期 结束日期 12/31

【问题讨论】:

  • 所以上面的 sn-p 不适合你?
  • 是的,它不起作用。它获取月份之间的所有日期范围(第一行),但是当它尝试过滤日期时返回零结果(第二行)。
  • 不是所有的间隔都向后吗?你不想Begin &gt;= start &amp;&amp; End &lt;= finish吗?你有相反的情况,Begin &lt;= start &amp;&amp; End &gt;= finish
  • @YaserAdelMehraban OP 已经说过他们必须忽略日期的年份部分。
  • 如果结束日期是 12/12,为什么结束日期 12/31 会包含在结果中?这不会使 12/31 超出过滤范围吗?

标签: c# entity-framework datetime


【解决方案1】:

您的情况有两种情况 - 月份等于边界月份,在这种情况下您必须测试天数,以及另一个月份,您忽略天数。因此查询:

List<DateRanges> tempDateRangeList = 
    dataContext.DateRanges.Where(r =>
        ((r.BeginDate.Month < startDate.Month) || 
         (r.BeginDate.Month == startDate.Month && r.BeginDate.Day <= startDate.Day)) &&
        ((r.EndDate.Month > finishDate.Month) ||
         (r.EndDate.Month == finishDate.Month) && r.EndDate.Day >= finsihDate.Day))
    .ToList();

条件很难看,很难理解,但涵盖了所有情况。此查询返回所有定义完全属于边界日期的日期范围的记录。

如果您希望查找与过滤范围重叠(完全或部分)的记录,则查询将是:

List<DateRanges> tempDateRangeList = 
    dataContext.DateRanges.Where(r =>
        ((r.BeginDate.Month < endDate.Month) || 
         (r.BeginDate.Month == endDate.Month && r.BeginDate.Day <= endDate.Day)) &&
        ((r.EndDate.Month > startDate.Month) ||
         (r.EndDate.Month == startDate.Month) && r.EndDate.Day >= startDate.Day))
    .ToList();

这种情况可能会让你心烦意乱,但效果很好。

【讨论】:

    【解决方案2】:

    如果 lambda 表达式不是强制性的,我使用了 linq 查询(因为这是我想到的第一个解决方案)。

    var validRanges = from range in ranges
                      where range.BeginDate.CompareTo(startDate) <= 0
                      where range.EndDate.CompareTo(endDate) >= 0
                      select range;
    

    使用 CompareTo 是比较两个 DateTime 结构的最简单方法。 我邀请您查看here 以获取该方法的完整说明。

    编辑

    如果您对日期的小时数不感兴趣,而只对日和月感兴趣,则应使用 range.BeginDate.Date.CompareTo(startDate.Date)range.EndDate.Date.CompareTo(endDate.Date)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      相关资源
      最近更新 更多