Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как оформить запрос  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 415
Здравствуйте.
MS SQL SERVER 2008

табл. периодов перемещения по должностям
СПо
01.01.2011 31.01.2011
31.01.2011 31.03.2011
31.03.2011 15.06.2011


табл. периодов болезни
СПо
10.01.2011 25.01.2011
31.01.2011 15.04.2011


Как оформить запрос чтобы получить результат
СПо
01.01.2011 10.01.2011
25.01.2011 31.01.2011
15.04.2011 15.06.2011


Словами ... если период работы входит в период болезни, то чтоб он период работы высекался, если период работы не пересекается с периодом болезни, то оставался как есть, если период работы пересекается с периодом болезни, то чтоб рассекался на 2 записи.
9 апр 14, 18:25    [15857846]     Ответить | Цитировать Сообщить модератору
 Re: Как оформить запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Выпишите все даты в одну колонку и объедините с таким же списком со смещением в одну строку.
9 апр 14, 19:07    [15858038]     Ответить | Цитировать Сообщить модератору
 Re: Как оформить запрос  [new]
west74
Member

Откуда: Челябинск
Сообщений: 76
begin

declare @work table
(
emp_id int,
begin_date date,
end_date date
);

declare @notwork
table
(
emp_id int,
begin_date date,
end_date date
);

declare @rezult
table
(
emp_id int,
begin_date date,
end_date date
);


declare @emp_id int;
declare @aDate date;
declare @aFlag int;
declare @aFlag_t int;
declare @aDateB date;
declare @aDateE date;



insert into @work (emp_id,begin_date,end_date) values
(1,'20110101','20110131'),(1,'20110131','20110331'),(1,'20110331','20110615');


insert into @notwork (emp_id,begin_date,end_date) values
(1,'20110110','20110125'),(1,'20110131','20110415');



set @aFlag_t=-1;

DECLARE cContact CURSOR LOCAL FORWARD_ONLY STATIC FOR
with ct
as
(
select emp_id,begin_date,SUM(flag) flag from (
select emp_id,begin_date,0 flag from @work A where emp_id=1
and not exists (select emp_id from @notwork B where emp_id=1 and A.begin_date between B.begin_date and B.end_date) -- исключаем начало периодов внутри бюлетня
union all
select emp_id,end_date,1 flag from @work A where emp_id=1
and not exists (select emp_id from @work B where emp_id=1 and B.begin_date=A.end_date) -- исключаем концы периодов работы совпадающие с началом следующих периодов
union all
select emp_id,begin_date,1 flag from @notwork where emp_id=1
union all
select emp_id,end_date,0 flag from @notwork where emp_id=1
) F
group by emp_id,begin_date

)

select emp_id,begin_date,flag
from ct
order by 2,3 desc
OPEN cContact
FETCH NEXT FROM cContact INTO @emp_id,@aDate,@aFlag
while @@FETCH_STATUS=0
Begin
if @aFlag_t=-1
set @aDateB=@aDate ;

set @aFlag_t=@aFlag;

if @aFlag>=1 and @aDateB<>@aDate
begin
Insert into @rezult(emp_id,begin_date,end_date) values (@emp_id,@aDateB,@aDate);
set @aFlag_t=-1;
end



fetch next from cContact into @emp_id,@aDate,@aFlag
end
close cContact
Deallocate cContact


select * from @rezult;

end
10 апр 14, 08:35    [15859522]     Ответить | Цитировать Сообщить модератору
 Re: Как оформить запрос  [new]
west74
Member

Откуда: Челябинск
Сообщений: 76
стресс тест не прошел

нада еще внутри цикла

set @aFlag_t=@aFlag; ->> if @aFlag=0 set @aFlag_t=@aFlag;
10 апр 14, 08:44    [15859549]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить