Linq to SQL - 计算日期范围之间交叉的天数

时间:2009-12-14 20:46:35

标签: linq-to-sql

我有一个包含多个记录的表,其中包含开始日期(PlacementDate)和结束日期(Pulled Date)。我将开始日期和结束日期参数传递给此函数,该函数需要返回与传入的开始日期和结束日期相交的记录,并指定每条记录相交的天数。

获取相交的记录很容易,得到日期范围之间的交叉天数并不那么容易......这就是我到目前为止所拥有的:

            var query = from d in db.TelemetryDevices
                    join p in db.DevicePlacements on d.TelemetryDeviceID equals p.TelemetryDeviceID
                    where d.CompanyID == companyId && d.BillingPlanID == billingPlanId
                        && (
                        (p.PlacementDate <= startDate && (p.PulledDate != null ? p.PulledDate.Value : DateTime.MaxValue) >= endDate)// { start - end }
                        || (p.PlacementDate <= startDate && (p.PulledDate != null ? p.PulledDate.Value : DateTime.MaxValue) >= startDate)// { start } end
                        || (p.PlacementDate >= startDate && (p.PulledDate != null ? p.PulledDate.Value : DateTime.MaxValue) <= endDate)// start { } end
                        || (p.PlacementDate >= startDate && (p.PulledDate != null ? p.PulledDate.Value : DateTime.MaxValue) >= endDate)// start { end }
                        )
                    select new DeviceView
                    {
                        TelemetryDeviceID = d.TelemetryDeviceID
                    };

如何解决这个问题的任何想法都将非常感激。

2 个答案:

答案 0 :(得分:0)

当你做arithemtic日期时,.Net隐含地使用TimeSpan类型。您可以将TimeSpan转换为天数。例如:

 int days = (DateTime.Now.AddDays(10) - DateTime.Now).Days;

将导致10天。您只需要在查询中找出用于比较的日期(开始日期或结束日期,具体取决于哪一个重叠)。

答案 1 :(得分:0)

看看这个。

如果我误解了,请告诉我。

List<MyClass> dates = new List<MyClass>();
dates.Add(new MyClass { StartDate = new DateTime(2009, 01, 01), EndDate = new DateTime(2009, 01, 08) });
dates.Add(new MyClass { StartDate = new DateTime(2009, 01, 15), EndDate = new DateTime(2009, 01, 20) });
dates.Add(new MyClass { StartDate = new DateTime(2009, 01, 22), EndDate = new DateTime(2009, 01, 31) });
DateTime sDate = new DateTime(2009, 01, 07);
DateTime eDate = new DateTime(2009, 01, 25);
var result = (from d in dates
             orderby d.StartDate
             where !(eDate < d.StartDate || sDate > d.EndDate)
             select new
             {
                 Days = (d.EndDate <= eDate && d.StartDate >= sDate ? d.EndDate.Subtract(d.StartDate).Days:
                 sDate >= d.StartDate && sDate <= d.EndDate && eDate >= d.EndDate ? d.EndDate.Subtract(sDate).Days:
                 eDate >= d.StartDate && eDate <= d.EndDate && sDate <= d.StartDate ? eDate.Subtract(d.StartDate).Days:
                 eDate <= d.EndDate && sDate >= d.StartDate ? eDate.Subtract(sDate).Days : 0)
                 }).Sum(x => x.Days);
int total = result;