Ste*_*hen 6 c# datetime entity-framework
在我的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();
Run Code Online (Sandbox Code Playgroud)
有没有人对我如何做到这一点有任何建议?
编辑:
BeginDate和EndDate的示例将是如下列表:
BeginDate 2016年1月1日,2016年5月25日,2016年11月9日
EndDates 2016年5月24日,2016年9月9日,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();
Run Code Online (Sandbox Code Playgroud)
情况很丑陋,很难遵循,但涵盖了所有情况。此查询返回定义完全属于边界日期的日期范围的所有记录。
如果您希望查找与过滤范围(完全或部分)重叠的记录,则查询将是:
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();
Run Code Online (Sandbox Code Playgroud)
这种情况可能会改变你的想法,但效果很好。