У кого-нибудь есть идеи, как наилучшим образом рассчитать количество дней, пересекающихся между двумя диапазонами дат?Количество дней, пересекающихся между двумя диапазонами дат
ответ
Получите новый диапазон, определенный поздним началом и более ранним концом, и определите количество дней с начала эпохи за каждый день в этом новом диапазоне.
Разница заключается в количестве дней на пересечении. Принимайте только положительные значения.
Отредактировано с учетом диапазонов вместо отдельных дат.
Вопрос задает между двумя датами Диапазоны не два Даты. (Отредактировано в ответ на комментарии)
Итак, если у вас есть 2 диапазона дат (r1s, r1e), вам необходимо определить, что начинается с начала, есть ли перекрытие и что такое перекрытие.
double overlap(DateTime r1s, DateTime r1e, DateTime r2s, DateTime r1e){
DateTime t1s,t1e,t2s,t2e;
if (rs1<rs2) //Determine which range starts first
{
t1s = r1s;
t1e = r1e;
t2s = r2s;
t2e = r2e;
}
else
}
t1s = r2s;
t1e = r2e;
t2s = r1s;
t2e = r1e;
}
if (t1e<t2s) //No Overlap
{
return -1;
}
if (t1e<t2e) //Partial Overlap
}
TimeSpan diff = new TimeSpan(t1e.Ticks - t2s.Ticks);
{
else //Range 2 totally withing Range 1
}
TimeSpan diff = new TimeSpan(t2e.Ticks - t2s.Ticks);
{
double daysDiff = diff.TotalDays;
return daysDiff;
}
«Предположим, что T1 всегда
Вы правы. Также я (и ответы выше) предполагают, что существует перекрытие. Мы должны проверить на это. – WombatPM
Если я правильно понял ваш вопрос, вы просите за количество дней, которые перекрывают два диапазона дат, например: Диапазон 1 = 2010-1-1 до 2010-2-1 Диапазон 2 = 2010-1-5 - 2010-2-5 в этом примере число пересекающихся дней составит 28 дней.
Вот пример кода для этого примера
DateTime rs1 = new DateTime(2010, 1, 1);
DateTime re1 = new DateTime(2010, 2, 1);
DateTime rs2 = new DateTime(2010, 1, 5);
DateTime re2 = new DateTime(2010, 2, 5);
TimeSpan d = new TimeSpan(Math.Max(Math.Min(re1.Ticks, re2.Ticks) - Math.Max(rs1.Ticks, rs2.Ticks) + TimeSpan.TicksPerDay, 0));
Вот пример из R. Это может прояснить ответ.
c_st = as.POSIXct("1996-10-14")
c_ed = as.POSIXct("1996-10-19")
d_st = as.POSIXct("1996-10-17")
d_ed = as.POSIXct("1999-10-22")
max(range(c_st,c_ed))-min(range(d_st,d_ed)) >= 0 & min(range(c_st,c_ed)) < max(range(d_st,d_ed))
Правда указывает, что они пересекаются, False в противном случае. [r]
Вот небольшой метод, который я написал, чтобы рассчитать это.
private static int inclusiveDays(DateTime s1, DateTime e1, DateTime s2, DateTime e2)
{
// If they don't intersect return 0.
if (!(s1 <= e2 && e1 >= s2))
{
return 0;
}
// Take the highest start date and the lowest end date.
DateTime start = s1 > s2 ? s1 : s2;
DateTime end = e1 > e2 ? e2 : e1;
// Add one to the time range since its inclusive.
return (int)(end - start).TotalDays + 1;
}
Отличное, прямое решение. Работает для меня и проходит все мои тесты. –
- 1. Количество дней пересекающихся диапазонов дат (таблица)
- 2. Сколько равные дней между двумя диапазонами дат, SQL
- 3. Число перекрестков между двумя диапазонами дат
- 4. Rails: рассчитать, сколько дней перекрыто между двумя диапазонами дат
- 5. Linq to SQL - количество дней на перекрестке между диапазонами дат
- 6. Как рассчитать количество недель между двумя диапазонами дат в excel
- 7. Получить строки между двумя диапазонами дат
- 8. Разделенные недели между двумя диапазонами дат
- 9. Количество дней между двумя датами (за исключением этих двух дат)
- 10. Количество дней между двумя датами
- 11. Запрос, который дает список дат между двумя диапазонами дат
- 12. подсчет дат между диапазонами
- 13. граф дней между двумя дней
- 14. Рассчитать количество дней между двумя днями
- 15. Microsoft Access - между двумя диапазонами дат с 1 пользовательским вводом
- 16. Получить список всех месяцев и года между двумя диапазонами дат
- 17. Разница между двумя диапазонами
- 18. Общего количества дней между двумя датами по
- 19. Рассчитать фактическое количество дней из серии диапазонов дат
- 20. Возврат всех дат между несколькими диапазонами дат
- 21. Проверка наличия дат между диапазонами
- 22. Петля Javascript между диапазонами дат
- 23. Список всех дат между диапазонами
- 24. VBA SUMIF между диапазонами дат
- 25. Эффективное обнаружение перекрытия между многими диапазонами дат
- 26. Как найти объекты между двумя диапазонами дат в MongoDB
- 27. Необходимо получить данные между двумя диапазонами дат с фиктивными строками
- 28. перекрывающиеся даты между двумя диапазонами дат в питоне
- 29. Как выбрать данные между двумя диапазонами дат в android SQLite
- 30. Javascript массив обеспечивает все дни/месяцы между двумя диапазонами дат
Спасибо всем за ваши комментарии ... Отличные предложения! Я не понимал, что это так просто. – BoredOfBinary