如何比较日期时间对象中的月和日

时间:2016-12-07 21:35:44

标签: c# entity-framework datetime

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

2 个答案:

答案 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)