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