powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
10 сообщений из 10, страница 1 из 1
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38420100
Aztech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица договоров страхования со следующими полями: ID компании, ID договора, Дата начала, Дата окончания. Нужно определить разрывы в страховке для каждой компании. Периоды страхового покрытия двух договоров одной компании могут накладываться и (хотя такого быть не должно) полностью входить один в другой.
Не совсем понимаю, как подступиться к задаче. Самое простое, что приходит в голову (благо, что диапазон целевых дат невелик - всего 5 лет и "цена деления" = 1 день) - объявить массив bool длиной в 5*365 дней и, перебирая договоры одной компании, последовательно помечать все дни, покрытые договорами. Когда договоры кончатся, пройти по массиву и определить "дырки". Но хотелось бы более универсальное решение, ибо если точность границ увеличить до минут/секунд, и увеличить диапазон дат, мое решение станет неэффективным. Предполагаемая среда разработки - VBA (excel/access). Заранее спасибо!
...
Рейтинг: 0 / 0
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38420212
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Недавно была похожая проблема объединения отрезков дат, но для Оракла. Нашел в инете алгоритм, красиво. Жаль, но access не поддерживает аналитических функций.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select min (beg_date) as beg_date, max (end_date) as end_date
from (select beg_date, end_date,
             sum(strt_grp) over (order by beg_date, end_date ) grp_num
      from (select beg_date, end_date,
                case when beg_date > 1 + max(end_date) over (order by beg_date, end_date rows between unbounded preceding and 1 preceding) then 1 end strt_grp
            from t
           )
     )
group by grp_num
order by beg_date
...
Рейтинг: 0 / 0
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38420463
Aztech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да мне в данном случае не особо важны "умения" access. Я ж могу из него выбирать данные, а все аналитические манипуляции производить в VBA. Мне алгоритм нужен.
...
Рейтинг: 0 / 0
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38420522
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AztechДа мне в данном случае не особо важны "умения" access. Я ж могу из него выбирать данные, а все аналитические манипуляции производить в VBA. Мне алгоритм нужен.
Сортировать диапазоны по началу. Потом обработать полученный массив, сливая последовательно очередной диапазон к текущему. Как только очередной диапазон не пересекается с текущим - дырка.
...
Рейтинг: 0 / 0
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38420653
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaAztechДа мне в данном случае не особо важны "умения" access. Я ж могу из него выбирать данные, а все аналитические манипуляции производить в VBA. Мне алгоритм нужен.
Сортировать диапазоны по началу.+1, а дальше как-то мутно написал.

Начало очередного диапазона периода нужно сравнивать с окончаниями всех предыдущих. Ведь может оказаться, что последний заканчивается раньше предпоследнего.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
    
rs1.Open "select * ...."
Set rs2 = rs1.Clone
rs1.Sort = "Start"
rs2.Sort = "Start"
rs1.MoveNext 'начинаем со второй позиции
While Not rs1.EOF
    rs2.AbsolutePosition = rs1.AbsolutePosition - 1
    While Not rs2.BOF
        If rs1!Start > rs2!Finish Then
            'дырка в периодах
        End If
        rs2.MovePrevious
    Wend
    rs1.MoveNext
Wend


Наверное можно как-то уменьшить количество проходов.
...
Рейтинг: 0 / 0
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38420669
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyа дальше как-то мутно написал
Да чё там мутного-то? там материалу на муть нехватает...
Вот у нас есть текущее состояние диапазона (Д). Вот есть очередной поддиапазон (П). Вариантов их взаимного расположения - немного.

Вариант 1. КонецП <= КонецД. Поддиапазон весть внутри диапазона. Можно его игнорировать. Границы диапазона не меняются.

Вариант 2. НачалоП > КонецД. Имеем дыру. Фиксируем диапазон, фиксируем дыру, П становится очередным Д.

Вариант 3. Всё остальное. Просто теперь КонецД смещаем в КонецП.
...
Рейтинг: 0 / 0
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38420925
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sergeyvgНедавно была похожая проблема объединения отрезков дат, но для Оракла. Нашел в инете алгоритм, красиво. Жаль, но access не поддерживает аналитических функций.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select min (beg_date) as beg_date, max (end_date) as end_date
from (select beg_date, end_date,
             sum(strt_grp) over (order by beg_date, end_date ) grp_num
      from (select beg_date, end_date,
                case when beg_date > 1 + max(end_date) over (order by beg_date, end_date rows between unbounded preceding and 1 preceding) then 1 end strt_grp
            from t
           )
     )
group by grp_num
order by beg_date


тут - 12567851 запрос, который решает эту же задачу, и "работает" в любой СУБД (в разумных пределах, конечно "любой")

----
ТС, т.е. тебе - подойдёт, советую
...
Рейтинг: 0 / 0
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38421150
Valer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример на 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
...
Рейтинг: 0 / 0
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38421404
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aztech,

у меня только а2007
...
Рейтинг: 0 / 0
Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
    #38654773
Гость1212
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как такой макрос для Excel написАть?
И как делать алгоритмы - если можно литературу или видео...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Алгоритм поиска разрывов в пересекающихся и вложенных диапазонах дат
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]