|
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
|
|||
---|---|---|---|
#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&fpage=42&tid=2156351]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 172ms |
0 / 0 |