在我的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();
这种情况可能会使您不寒而栗,但是效果很好。