在我的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的示例将是如下列表:
BeginDate 1/1/2016,2016年5月25日,2016年9月9日
EndDates 2016年5月24日,2016年9月9日,2016年12月31日
过滤日期为: startDate = 12/8 finishDate = 12/12
预期结果: 9/11的开始日期 截止日期为12/31
答案 0 :(得分:2)
您的情况有两种情况 - 月份等于边界月份,在这种情况下,您必须测试日期编号,以及您忽略日期的不同月份。因此查询:
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();
这种情况可能让你大吃一惊,但效果很好。
答案 1 :(得分:0)
如果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)