Linq to SQL - количество дней в пересечении между диапазонами дат - PullRequest
1 голос
/ 14 декабря 2009

У меня есть таблица с несколькими записями с начальной датой (PlacementDate) и конечной датой (Дата выборки). Я передаю параметры даты начала и окончания в эту функцию, которая должна возвращать записи, которые пересекают пройденную дату начала и окончания, а также указывать, сколько дней пересекает каждая запись.

Получить записи, которые пересекаются, легко, получить количество дней пересечения между диапазонами дат не так просто ... Вот что у меня так далеко:

            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 голосов
/ 15 декабря 2009

Посмотрите на это.

Если я не понял, пожалуйста, дайте мне знать.

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;
0 голосов
/ 15 декабря 2009

Когда вы делаете арифметику дат, .Net неявно использует типы TimeSpan. Вы можете преобразовать TimeSpan в количество дней. Например:

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

приведет к 10 дням. Вам просто нужно выяснить в запросе, какую дату использовать для сравнения (начальную или конечную дату, в зависимости от того, какая из них перекрывается).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...