我有一个包含多个记录的表,其中包含开始日期(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
};
如何解决这个问题的任何想法都将非常感激。
答案 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;