Имя: Пароль:
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
Что то автор не договаривает.
Если Задача найти пересекающиеся интервалы, тогда условие поиска -  начало интервала попадает в другой интервал.
   Если перебором, тогда два вложенных цикла
   Если запросом, тогда соединяем Таблицу саму с собой по условию ДатаНачалаИнтервала правой таблицы попадает в интервал левой.
  Чуть сложнее найти не пересекающиеся интервалы.
  Еще сложнее найти продолжительность пересекающихся интервалов.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший