Разработанный 'period'
'period' как время видимости
В первую очередь предлагаю сократить синтаксис:
выбросить служебное слово 'valid', а дату писать без кавичек
(в кавычках слишком длинный синтаксис).
valid period
|
|
period
|
'10 september 2007'
|
10.09.07 -- without quotes
|
Кроме того, предлагаю понимать 'period' исключительно как время,
в течение которого запись видима.
insert into a (a1) values (3.14) period 01.01.07/05.00 till 01.01.07/10.00;
update sys set @datatime=01.01.07/03.00;
select * from a;
-- result: non records, because record is invisible before 05.00
update sys set @datatime=01.01.07/08.00;
select * from a;
-- result: one record
update sys set @datatime=01.01.07/11.00;
select * from a;
-- result: non records, because record is invisible after 10.00
Следующие два выражения эквивалентны
(если сделать 'update' вместо 'delete', то старая версия записи будет видима только в те же сроки -
с 05.00 до 10.00).
update sys set @datatime=01.01.07/05.00;
insert into a (a1) values (3.14);
update sys set @datatime=01.01.07/10.00;
delete from a;
-- value "3.14" is visible from 05.00 to 10.00
insert into a (a1) values (3.14) period 01.01.07/05.00 till 01.01.07/10.00;
-- value "3.14" is visible from 05.00 to 10.00
Можно изменить не только значения полей, но и время видимости записи:
отдельно
update a period 01.01.07/05.00 till 01.01.07/10.00;
update a period select @t1, @t2 from ... ;
update a period select @ti from ... ; -- datatype "time interval"
или вместе с изменением полей
update a set @a1=1.00 period 01.01.07/05.00 till 01.01.07/10.00;
update a set @a1=1.00 period select @t1, @t2 from ... ;
update a set @a1=1.00 period select @ti from ... ; -- datatype "time interval"
'period' как аналог 'where'
Невидимые записи можно извлечь принудительно,
если указать интервал времени в запросе.
select * from a where ... period a inside 01.01.01 till 01.01.10;
select * from a where ... period a inside (select @t1, @t2 from ...);
select * from a where ... period a inside (select @ti from ...);
Возможно соединить таблицы по времени видимости.
select @a1, @b1
from a, b
where ...
period a inside b;
Для периодов видимости возможны следующие операции:
period a < b |
|
a.end < b.begin |
period a <= b |
a.end < b.end |
period a = b |
a.begin=b.begin and a.end=b.end |
period a <> b |
not a.begin=b.begin or not a.end=b.end |
period a >= b |
a.begin > b.begin |
period a > b |
a.begin > b.end |
period a inside b |
a.begin>b.begin and a.end<b.end |
period a include b |
a.begin<b.begin and a.end>b.end |
Если интервал времени задается под-запросом,
то в нем служебные слова 'union, intersect, except'
должны быть заменены словами 'combine, cross, reject',
чтобы повысить различимость собственно запроса и под-запроса.
select ...
period a inside select ...
combine -- instead of 'union'
select ...
cross -- instead of 'intersect'
select ...
reject -- instead of 'except'
select ...
union
select ...
;
Тюрин Дмитрий