Имя: Пароль:
1C
 
Покритикуйте решение - выборка количества пересекающихся периодов
, ,
0 mikecool
 
12.03.21
11:03
Вот что у меня вышло:
ВЫБРАТЬ
    КОЛИЧЕСТВО(Лево.От) КАК От
ИЗ
    Периоды КАК Лево
        ЛЕВОЕ СОЕДИНЕНИЕ Периоды КАК Право
        ПО (НЕ Лево.От = Право.От)
            И (НЕ Лево.До = Право.До)
            И Лево.От < Право.До
            И Лево.До > Право.От
            И Лево.От >= Право.От
ГДЕ
    НЕ Право.От ЕСТЬ NULL
где у меня могут быть проколы?
зы: проверял пока на 3х интервалах с разными периодами, вроде результат верный
1 dka80
 
12.03.21
11:18
10-20
1-10
2 mikecool
 
12.03.21
11:24
(1) стыкуются, не пересекаются
3 dka80
 
12.03.21
11:31
(22) как это стыкуются? У них 10 число общий день
10 00:00:00
10 23:59:59
4 Deon
 
12.03.21
11:44
Только тут не количество пересекающихся периодов, а количество пересечений.
Например, для таких Периодов вернется 6 пересечений:
1-10
2-9
3-8
4-7
И да, запрос некорректно отработает и вернет 5 для таких периодов:
1-10
2-8
3-8
4-7
5 Deon
 
12.03.21
11:55
Я так понимаю, что этот кусок должен отрезать соединение периода с самим собой?
ПО (НЕ Лево.От = Право.От)
И (НЕ Лево.До = Право.До)
6 Вафель
 
12.03.21
12:01
пересечение делается так
начало1 <= конец2 и
конец1 >= начало2
7 mistеr
 
12.03.21
13:14
(0) (3) (6) Нужно уточнить, интервалы открытые или закрытые, слева и справа. И что означает "стыкуются".
8 mikecool
 
12.03.21
14:29
(4) проверю
(6) именно, вот только только при таком условии кол-во пересечений х2 из-за соединения одинаковых таблиц
9 Малыш Джон
 
12.03.21
15:39
(0) Эммм... А что тут проверять?

Если периоды "зацепляются" своими концами, то зацепляются, если нет, то нет

(Право1>Лево2 И Право2>Лево1)
10 Малыш Джон
 
12.03.21
15:40
+(9)  не заметил сразу (6)
11 Вафель
 
12.03.21
15:41
(8) условие что начало и конец не совпадают
НЕ (начало1 = начало2 и конец1  = конец2)
12 mikecool
 
12.03.21
15:42
(11) ага, вот тут есть косячок, спасибо
13 Вафель
 
12.03.21
15:42
хотя если в таблице есть одинаковые периоды, то нужно еще и уникальное поле проверять
14 Вафель
 
12.03.21
15:43
(12) забыл на верно как скобки НЕ раскрываются
15 mikecool
 
12.03.21
15:44
+12 хотя стоп
НЕ (начало1 = начало2 и конец1  = конец2) == НЕ начало1 = начало2 ИЛИ Не конец1  = конец2
а это неверно
16 Малыш Джон
 
12.03.21
15:45
(11) не, не поможет

проблема в том, что сначала период1 сверяется с периодом 2, а потом период2 сравнивается с периодом 1
17 Малыш Джон
 
12.03.21
15:46
(15) если делаешь соединение таблицы саму с собой, т.е. точно знаешь, что идентичные данные сравниваются, т.е. точно задвоится количество - дели на 2 )