Имя: Пароль:
1C
 
Как найти ошибку при наложении одного периода на другой ?
,
0 vv2304
 
14.02.24
16:26
Запрос выгружаю в ТЗ.
Там встречаются такие строки, что является ошибкой.
Т.е. идет накладка по времени.
01.01.0001  8:00:00   -   01.01.0001 10:00:00
01.01.0001  9:00:00   -   01.01.0001 11:00:00
Не могу придумать алгоритм поиска таких ошибок.
1 Garykom
 
гуру
14.02.24
16:31
гугли "1С поиск пересекающихся интервалов"
2 ass1c
 
14.02.24
16:50
(0) не можешь придумать, используй готовое или укради:
Функция ПериодПересеченияДвухИнтервалов(ДатаНачалаПервогоИнтервала, ДатаОкончанияПервогоИнтервала,
    ДатаНачалаВторогоИнтервала, ДатаОкончанияВторогоИнтервала) Экспорт

Функция ИнтервалыПересекаются(ДатаНачалаПервогоИнтервала, ДатаОкончанияПервогоИнтервала,
    ДатаНачалаВторогоИнтервала, ДатаОкончанияВторогоИнтервала) Экспорт
3 vv2304
 
14.02.24
16:55
Спасибо. А то голову сломал.
4 Garykom
 
гуру
14.02.24
17:06
Эмм.
Лучше это делать запросами
5 vv2304
 
14.02.24
17:20
Буду пробовать. К тому же, могут быть не два пересекающихся, а неограниченное количество.
6 Гена
 
гуру
14.02.24
18:00
Каждый интервал (i,j = 1,…,N) имеет своё начало А и свой конец В. Сортировка по концам.
Внешний цикл по i
Внутренний цикл по j > i
Bi < Aj
Иначе метим ошибкой
Конец внутреннего цикла по j
Конец внешнего цикла по i
7 ДедМорроз
 
14.02.24
19:02
Интервалы не пересекаются,если начало первого больше конца второго или начало второго больше конца первого.
8 vv2304
 
15.02.24
17:24
когда вот так, то нормально нахожу пересечение:
01.01.0001  8:00:00   -   01.01.0001 10:00:00
01.01.0001  9:00:00   -   01.01.0001 11:00:00
а вот если так
01.01.0001  8:00:00   -   01.01.0001 10:00:00
01.01.0001  10:00:00   -   01.01.0001 11:00:00
тоже выходит как ошибка с наложением интервалов. Хотя по условиям задачи не должно.
9 Волшебник
 
15.02.24
17:24
(8) нижнюю границу включайте (больше или равно), а верхнюю исключайте (строго меньше)
10 vv2304
 
15.02.24
18:04
наверное неправильным путем пошел.
В одной таблице (будем считать, что это один день)
8:00:00   -   10:00:00
9:00:00   -   11:00:00
13:00:00  -   14:00:00
Во второй таблице объединяю пересекающиеся периоды.
8:00:00   -   11:00:00
13:00:00  -   14:00:00
Потом ищу периоды первой таблицы во второй таблице.
Нахожу 13:00:00  -   14:00:00.
Значит нормально.
А вот периоды
8:00:00   -   10:00:00
9:00:00   -   11:00:00
не найдены во второй таблице и поэтому считаются ошибочными.
Вроде все нормально, но спотыкаюсь когда конец одного периода равен началу другого.
11 Garykom
 
гуру
15.02.24
18:06
А потом удивляются почему это два билета на одно место
Или две записи на одно время к врачу...
13 Гена
 
гуру
15.02.24
20:51
(12) А куда оно денется с подводной лодки, когда идёт ПОЛНЫЙ перебор. Пущай машина ВСЁ перебирает, у ей мосх толще...
14 Волшебник
 
15.02.24
20:56
Не справились?
15 Гена
 
гуру
15.02.24
21:00
(14) Скорее всего автор увидел задвоение сообщений, например, когда пересекается сначала 2-ой интервал с 5-ым, а потом 5-ый со 2-ым.
16 Волшебник
 
15.02.24
21:03
(15) Гена, оставьте автору сообщать свою проблему. Не рвитесь в герои, пока не позовут. Это очень важно для всяких алгоритмов.
17 Волшебник
 
15.02.24
21:04
(12) Ваш код - говно. Выбросите его!
18 Гена
 
гуру
15.02.24
23:26
(16) Хорошо. Я просто подумал, а можно ли найти пересечения интервалов без перебора. Мелькнула следующая мысль: сортируем по возрастанию просто вектор начал (Ai) и концов (Bi-0.1), как точки, ВМЕСТЕ без разбору. Начала чёрные, концы красные. Если колесо рулетки, т.е. перемежаются чёрные и красные цвета ABABABABAB - то пересечений нет. Если же встретится одинаковый цвет ...AA... или ...BB... - то это и есть пересечение.

Как-то так )
19 Волшебник
 
15.02.24
23:58
(18) Без перебора нельзя даже теоретически. Можно ли одним или двумя действиями? Возможно. Зависит от языка и интерпретатора (понимающей системы). Конечно, где-то там за сотней слоёв будет перебор.

А как без перебора-то? Даже задачу поставить невозможно.
20 Гена
 
гуру
16.02.24
08:06
Вот чиркнул в эксельке для наглядности:
https://ru.files.me/u/kb4v8mb394
21 Волшебник
 
16.02.24
10:52
(20) "Началы" - зачётно 👍
22 ДедМорроз
 
17.02.24
00:08
Соединение таблицы сама с собой - это и есть перебор,по сути.
23 Волшебник
 
17.02.24
00:22
(22) Это уж как план запроса решит
24 ProxyInspector
 
17.02.24
10:18
Что то автор не договаривает.
Если Задача найти пересекающиеся интервалы, тогда условие поиска -  начало интервала попадает в другой интервал.
   Если перебором, тогда два вложенных цикла
   Если запросом, тогда соединяем Таблицу саму с собой по условию ДатаНачалаИнтервала правой таблицы попадает в интервал левой.
  Чуть сложнее найти не пересекающиеся интервалы.
  Еще сложнее найти продолжительность пересекающихся интервалов.