Я не хочу уточнять, правильна ли ваша модель данных, просто ответьте на вопрос.Вам нужно два update
с датами, один insert
и, необязательно, один delete
, чтобы удалить строки, если новый период охватывает весь предыдущий период (ы).
declare
r data%rowtype;
begin
r.child := 'c1';
r.parent := 'p4';
r.root := 'r4';
r.effective_date := date '2018-09-12';
r.expire_date := date '2018-09-14';
r.status := 'NA';
delete from data
where r.effective_date <= effective_date and expire_date <= r.expire_date;
update data set expire_date = r.effective_date
where expire_date between r.effective_date and r.expire_date;
update data set effective_date = r.expire_date
where effective_date between r.effective_date and r.expire_date;
insert into data values r;
end;
Таблица, которую я использовал дляtest:
create table data(child, parent, root, effective_date, expire_date, status) as (
select 'c1', 'p1', 'r1', date '2018-09-11', date '2018-09-13', 'NA' from dual union all
select 'c1', 'p2', 'r2', date '2018-09-13', date '2018-09-15', 'NA' from dual union all
select 'c1', 'p3', 'r3', date '2018-09-15', date '9999-12-01', 'A' from dual );
Это простые операции, если у вас есть индексы по датам, они должны быть быстрыми.Вы можете объединить два обновления в одну статистику, используя or
и case when
, но я сомневаюсь, что это крайне важно.