|  | 
| 
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат | |||
|---|---|---|---|
| #18+ Есть таблица договоров страхования со следующими полями: ID компании, ID договора, Дата начала, Дата окончания. Нужно определить разрывы в страховке для каждой компании. Периоды страхового покрытия двух договоров одной компании могут накладываться и (хотя такого быть не должно) полностью входить один в другой. Не совсем понимаю, как подступиться к задаче. Самое простое, что приходит в голову (благо, что диапазон целевых дат невелик - всего 5 лет и "цена деления" = 1 день) - объявить массив bool длиной в 5*365 дней и, перебирая договоры одной компании, последовательно помечать все дни, покрытые договорами. Когда договоры кончатся, пройти по массиву и определить "дырки". Но хотелось бы более универсальное решение, ибо если точность границ увеличить до минут/секунд, и увеличить диапазон дат, мое решение станет неэффективным. Предполагаемая среда разработки - VBA (excel/access). Заранее спасибо! ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 08.10.2013, 12:51 |  | ||
| 
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат | |||
|---|---|---|---|
| #18+ Недавно была похожая проблема объединения отрезков дат, но для Оракла. Нашел в инете алгоритм, красиво. Жаль, но access не поддерживает аналитических функций. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 08.10.2013, 13:37 |  | ||
| 
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат | |||
|---|---|---|---|
| #18+ Да мне в данном случае не особо важны "умения" access. Я ж могу из него выбирать данные, а все аналитические манипуляции производить в VBA. Мне алгоритм нужен. ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 08.10.2013, 15:23 |  | ||
| 
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат | |||
|---|---|---|---|
| #18+ AztechДа мне в данном случае не особо важны "умения" access. Я ж могу из него выбирать данные, а все аналитические манипуляции производить в VBA. Мне алгоритм нужен. Сортировать диапазоны по началу. Потом обработать полученный массив, сливая последовательно очередной диапазон к текущему. Как только очередной диапазон не пересекается с текущим - дырка. ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 08.10.2013, 15:54 |  | ||
| 
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат | |||
|---|---|---|---|
| #18+ AkinaAztechДа мне в данном случае не особо важны "умения" access. Я ж могу из него выбирать данные, а все аналитические манипуляции производить в VBA. Мне алгоритм нужен. Сортировать диапазоны по началу.+1, а дальше как-то мутно написал. Начало очередного диапазона периода нужно сравнивать с окончаниями всех предыдущих. Ведь может оказаться, что последний заканчивается раньше предпоследнего. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Наверное можно как-то уменьшить количество проходов. ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 08.10.2013, 17:16 |  | ||
| 
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат | |||
|---|---|---|---|
| #18+ Antonariyа дальше как-то мутно написал Да чё там мутного-то? там материалу на муть нехватает... Вот у нас есть текущее состояние диапазона (Д). Вот есть очередной поддиапазон (П). Вариантов их взаимного расположения - немного. Вариант 1. КонецП <= КонецД. Поддиапазон весть внутри диапазона. Можно его игнорировать. Границы диапазона не меняются. Вариант 2. НачалоП > КонецД. Имеем дыру. Фиксируем диапазон, фиксируем дыру, П становится очередным Д. Вариант 3. Всё остальное. Просто теперь КонецД смещаем в КонецП. ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 08.10.2013, 17:29 |  | ||
| 
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат | |||
|---|---|---|---|
| #18+ sergeyvgНедавно была похожая проблема объединения отрезков дат, но для Оракла. Нашел в инете алгоритм, красиво. Жаль, но access не поддерживает аналитических функций. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. тут - 12567851 запрос, который решает эту же задачу, и "работает" в любой СУБД (в разумных пределах, конечно "любой") ---- ТС, т.е. тебе - подойдёт, советую ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 08.10.2013, 22:39 |  | ||
| 
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат | |||
|---|---|---|---|
| #18+ пример на T SQL, правда вместо дат стоят целые declare @dog table( date1 int , date2 int ) --- исходные данные пример на T SQL, правда вместо дат стоят целые insert into @dog (date1 ,date2) values (1 ,2) insert into @dog (date1 ,date2) values (3 ,6) insert into @dog (date1 ,date2) values (11 ,12) insert into @dog (date1 ,date2) values (11 ,15) insert into @dog (date1 ,date2) values (21 ,25) insert into @dog (date1 ,date2) values (23 ,27) insert into @dog (date1 ,date2) values (30 ,40) insert into @dog (date1 ,date2) values (31 ,39) --- занятые даты select distinct d1.date1 + v.number from @dog d1 inner join master.dbo.spt_values v on v.type='P' and v.number <= ( d1.date2 - d1.date1 ) and number >=0 --- не занятые даты select number from master.dbo.spt_values where type='P' and number <= 45 and number >0 and number not in ( select distinct d1.date1 + v.number from @dog d1 inner join master.dbo.spt_values v on v.type='P' and v.number <= ( d1.date2 - d1.date1 ) and number >=0 ) order by number ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 09.10.2013, 10:23 |  | ||
| 
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат | |||
|---|---|---|---|
| #18+ Aztech, у меня только а2007 ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 09.10.2013, 12:47 |  | ||
|  | 

| start [/forum/topic.php?fid=60&msg=38420100&tid=2156351]: | 0ms | 
| get settings: | 9ms | 
| get forum list: | 15ms | 
| check forum access: | 4ms | 
| check topic access: | 4ms | 
| track hit: | 54ms | 
| get topic data: | 10ms | 
| get forum data: | 3ms | 
| get page messages: | 52ms | 
| get tp. blocked users: | 2ms | 
| others: | 231ms | 
| total: | 384ms | 

| 0 / 0 | 
