在我的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日

过滤日期为:
startDate = 12/8
finishDate = 12/12

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

最佳答案

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

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();

这种情况可能会使您不寒而栗,但是效果很好。

10-05 20:33
查看更多