Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / пересечение диапазонов дат / 20 сообщений из 20, страница 1 из 1
10.07.2007, 19:16
    #34651566
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
Два диапазона дат, надо составить выражение возвращающее true если существует хотя бы один день, общий для этих диапазонов и false если такого дня не существует. Ну и желательно чтобы выражение было попроще. Казалось бы, вопрос простой, но я сидел, пыхтел, наконец залез в Гугл, и нашел только одно(!) описание решения. Копирую сюда, "чтоб было".
ссылка
Проверка пересечения диапазонов датСегодня на работе возник вопрос, как наиболее посто проверить, пересекаются ли два диапазона дат. Моя жена (по образованию математик, работает вместе со мной программистом) сходу выдала очень простой способ.

[BeginDate1 - EndDate1] - первый диапазон

[BeginDate2 - EndDate2] - второй диапазон

Диапазоны не пересекаются, если BeginDate2 > EndDate1 или EndDate2 < BeginDate1. Используйте отрицание и получите условие пересечения.
...
Рейтинг: 0 / 0
10.07.2007, 19:34
    #34651594
Nikolay B.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
S.G.Два диапазона дат, надо составить выражение возвращающее true если существует хотя бы один день, общий для этих диапазонов и false если такого дня не существует. Ну и желательно чтобы выражение было попроще. Казалось бы, вопрос простой, но я сидел, пыхтел, наконец залез в Гугл, и нашел только одно(!) описание решения.
Рассказываю алгоритм.
1) Берем лист бумаги
2) Рисуем на листке бумаги прямую линию со стрелочкой на конце.
3) Под стрелочкой, чуть ниже, рисуем T(сек.).
4) Произвольным образом отмечаем на прямой 4 точки.
5) В произвольном порядке подписываем эти точки : BeginDate1, BeginDate2, EndDate1, EndDate2
6) Смотрим
7) Думаем.
8) Пишем решение.
...
Рейтинг: 0 / 0
10.07.2007, 19:38
    #34651597
Хрюхрюшкин.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
Раз пять приходилось решать задачу.
Всегда решал таким способом:
Код: plaintext
1.
2.
[BeginDate1 - EndDate1]
[BeginDate2 - EndDate2]

Если BeginDate2 >= BeginDate1, то

Код: plaintext
1.
BeginDate2 <= EndDate1


Это и есть условие пересечения диапазонов.

Другими словами
Код: plaintext
1.
(BeginDate2 >= BeginDate1 && BeginDate2 <= EndDate1) || (BeginDate2 < BeginDate1 && BeginDate1 <= EndDate2)
...
Рейтинг: 0 / 0
10.07.2007, 23:07
    #34651848
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
дааа.... математики....
BeginDate1 <= EndDate2 AND BeginDate2 <= EndDate1
Вы б еще циклами начали это решать.
...
Рейтинг: 0 / 0
10.07.2007, 23:19
    #34651863
Хрюхрюшкин.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
Бывает.
...
Рейтинг: 0 / 0
11.07.2007, 05:20
    #34652056
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
S.G. wrote:

> Два диапазона дат, надо составить выражение
В чем проблема-то? Диапазоны пересекаются, если конец первого диапазона
назодится позже начала второго. и Начало первого диапазона находится раньше
начала второго.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.07.2007, 11:33
    #34652650
Dan Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
Общий алгоритм для нахождения факта пересечения любых отрезков, лежащих на одной линии

Имеются отрезки
(Line1_X1, Line1_X2)
(Line2_X1, Line2_X2)

Тест
Min(Max(Line1_X1, Line1_X2), Max(Line2_X1, Line2_X2)) >= Max(Min(Line1_X1, Line1_X2), Min(Line2_X1, Line2_X2))

Если результат положительный, то отрезки имеют хотя бы одну общую точку.

Смысл алгоритма: найти общий отрезок, принадлежащий двум заданным отрезкам (что-то типа того)

Verba volent, scripta manent
...
Рейтинг: 0 / 0
11.07.2007, 22:55
    #34654928
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
Ух ты, тут даже обсуждение пошло
Да никто и не говорил что задача- супер- пупер. Можно решить по разному. Но, желательно, чтобы решение было попроще , на пальцах, чтобы сразу видно было, что оно правильное. Потому и запостил сюда, потому что понравилось.

Nikolay B.
Рассказываю алгоритм.
1) Берем лист бумаги
2) Рисуем на листке бумаги прямую линию со стрелочкой на конце.
3) Под стрелочкой, чуть ниже, рисуем T(сек.).
4) Произвольным образом отмечаем на прямой 4 точки.
5) В произвольном порядке подписываем эти точки : BeginDate1, BeginDate2, EndDate1, EndDate2
6) Смотрим
7) Думаем.
8) Пишем решение.Николай, сходите сюда и скажите, под какое именно из определений алгоритма попадает ваш. Где в определениях алгоритма написано "смотрим", "думаем", и т.д. А насчет произвольного порядка- вы предлагаете решать задачу методом Монте- Карло?
...
Рейтинг: 0 / 0
11.07.2007, 23:01
    #34654938
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
White Owl, ErV - спасибо.
...
Рейтинг: 0 / 0
12.07.2007, 10:19
    #34655449
Nikolay B.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
S.G.Николай, сходите сюда и скажите, под какое именно из определений алгоритма попадает ваш.

Спасибо, не пойду. Верю, что под определение не попадет. Однако сути это не меняет.
S.G.
А насчет произвольного порядка- вы предлагаете решать задачу методом Монте- Карло?
Ответ : нет.
Встречный вопрос : Вы предлагаете считать, что на сравнение диапазоны нам приходят исключительно в виде BeginDate1<=EndDate1 и BeginDate2<=EndDate2 ?
Дополнительный вопрос : А почему ж Вы тогда не считает, что и BeginDate1<=EndDate2 ?
Тогда вообще все решается одним сравнением.
Какое элегантное решение! Ну просто - Ох! Какое удовольствие решать задачу для идеальных условий!
НЛ, как говориться.
...
Рейтинг: 0 / 0
12.07.2007, 10:23
    #34655467
Dan Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
S.G.White Owl, ErV - спасибо.
хм... а если один диапазон является частью другого диапазона, то это разве не является пересечением?
...
Рейтинг: 0 / 0
12.07.2007, 10:25
    #34655470
Dan Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
Nikolay B.Ох! Какое удовольствие решать задачу для идеальных условий!
+1 Золотые слова :)
...
Рейтинг: 0 / 0
12.07.2007, 18:18
    #34657646
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
Dan Blackхм... а если один диапазон является частью другого диапазона, то это разве не является пересечением?Является. Что тебя смущает?
...
Рейтинг: 0 / 0
12.07.2007, 18:43
    #34657701
Dan Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
White Owl Dan Blackхм... а если один диапазон является частью другого диапазона, то это разве не является пересечением?Является. Что тебя смущает?
Уже ничего :-) ляпнул, не подумавши ;)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
28.10.2014, 17:30
    #38789685
feniks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
А как быть если число отрезков может быть более 2х и в каждом случае различно, как быть?
...
Рейтинг: 0 / 0
28.10.2014, 18:12
    #38789736
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
feniks , тогда - по индукции

Ищем пересечение первых двух, затем пересечение ПЕРЕСЕЧЕНИЯ с третьим и т.д.
Выход - либо при отсутствии пересечения на каком-то этапе, либо когда отрезки закончатся.
...
Рейтинг: 0 / 0
28.10.2014, 18:15
    #38789740
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
Я когда-то решил эту задачу для бесконечных диапазонов слева или справа. И для вариантов
разных сочетаний конечных и бесконечных.
...
Рейтинг: 0 / 0
28.10.2014, 23:30
    #38789965
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
feniksА как быть если число отрезков может быть более 2х и в каждом случае различно, как быть?надо начать с постановки своей задачи.
результат будет true когда:
- все пары диапазонов (отрезков?) имеют пересечение в одной и той же дате, или
- каждая пара имеет пересечение хотя бы в одной дате, или
- хотя бы одна пара имеет пересечение
?
...
Рейтинг: 0 / 0
29.10.2014, 09:28
    #38790194
feniks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
Постановка задачи такая.
Запрос возвращает таблицу следующего вида (лицевой более чем в 1-м договоре):
Договор Лицевой ДатаНачала ДатаОкончания1 2 01.01.2014 31.01.20142 2 01.02.2014 01.01.20453 3 01.01.2014 31.01.20144 3 01.02.2014 01.01.20455 3 01.03.2014 01.04.2014

Один лицевой встречающийся в 2-х и более договорах, необходимо проверить на пересечение диапазонов дат ДатаНачала и ДатаОкончания. Если есть пересечения, это ошибка.
Результат нужен в виде таблицы пересекающихся дат лицевых счетов, для их дальнейшего разбора.

Таблица пересечений:
Договор Лицевой ДатаНачала ДатаОкончания ПризнакПересечения3 3 01.01.2014 31.01.2014 04 3 01.02.2014 01.01.2045 15 3 01.03.2014 01.04.2014 1

Средства решения задачи: T-SQL.
Вот какая вот задача :)
...
Рейтинг: 0 / 0
29.10.2014, 10:27
    #38790316
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пересечение диапазонов дат
feniksОдин лицевой встречающийся в 2-х и более договорах, необходимо проверить на пересечение диапазонов дат ДатаНачала и ДатаОкончания. Если есть пересечения, это ошибка.Значит, это приблизительно третий случай в моем вопросе. Надо рассмотреть все пары диапазонов. Через sql я бы решил, используя соединение "таблицу следующего вида" саму с собой, по условию равенства поля "лицевой".
Что-то в виде
select * // здесь процедура сравнения двух диапазонов, из T1 и T2
from TSV T1
join TSV T2 on (T1.лицевой = T2.лицевой ) and (T1.договор > T2.договор)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / пересечение диапазонов дат / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]