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

Откуда:
Сообщений: 19
Добрый день уважаемые форумчане.
Прошу вас помочь в решении следующей задачи.


T1 - Таблица общего стажа по сотрудникам
Таб№ Начало Окончание
0001 01.01.2012 31.12.2012
0002 01.02.2012 25.12.2012
…… ………. ………..
000N 01.01.2012 31.12.2012



T2 - Таблица больничных листов сотрудников из Т1
Таб№ Начало Окончание
0001 15.01.2012 25.01.2012
0001 10.05.2012 15.05.2012
0002 01.02.2012 15.02.2012
…… ………… …………..
000N 03.10.2012 15.10.2012


Как из этих двух таблиц сделать третью, в котором стаж работы из Т1 разбит с учетом больничных листов из Т2.
Т.е. должно получиться сдедующее:
Таб№ Начало Окончание
0001 01.01.2012 14.01.2012
0001 15.01.2012 25.01.2012
0001 26.01.2012 09.05.2012
0001 10.05.2012 15.05.2012
0001 16.05.2012 31.12.2012
0002 01.02.2012 31.01.2012
0002 01.02.2012 15.02.2012
0002 16.02.2012 25.12.2012
….. ……. ……..
000N 01.01.2012 02.10.2012
000N 03.10.2012 15.10.2012
000N 16.10.2012 31/12.2012



Платформа MS SQL 2000.
Заранее благодарю за любую помощь в обсуждении.
18 мар 13, 10:53    [14061338]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
elec,

больничный лист влияет на стаж?
Это что-то новенькое
18 мар 13, 10:56    [14061349]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?  [new]
elec
Member

Откуда:
Сообщений: 19
iap,
Мне нужно выделит периоды нахождения в отпуске по беременности и родам, по уходу за ребенком до 1,5 лет и 3 лет. А эти документы оформляются как больничные листы.
18 мар 13, 11:01    [14061373]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Добавил в тестовые данные сотрудника 0003, у которого вообще не было больничных.

-- drop table #T1, #T2;

set dateformat dmy;

create table #T1 (Num varchar(10), Start_Date datetime, End_Date datetime);
create table #T2 (Num varchar(10), Start_Date datetime, End_Date datetime);

insert #T1 (Num, Start_Date, End_Date)
select '0001', '01.01.2012', '31.12.2012' union all
select '0002', '01.02.2012', '25.12.2012' union all
select '0003', '01.01.2012', '31.12.2012' union all
select '000N', '01.01.2012', '31.12.2012';

insert #T2 (Num, Start_Date, End_Date)
select '0001', '15.01.2012', '25.01.2012' union all
select '0001', '10.05.2012', '15.05.2012' union all
select '0002', '01.02.2012', '15.02.2012' union all
select '000N', '03.10.2012', '15.10.2012';

select distinct y.Num, y.Start_Date, y.End_Date
from
(
	select t1.Num,
		isnull(case when N.N = 1 then t1.Start_Date else dateadd(day, 1, x.End_Date) end, t1.Start_Date) as Start_Date,
		isnull(case when N.N = 1 then dateadd(day, -1, x.Start_Date) else t1.End_Date end, t1.End_Date) as End_Date
	from #T1 t1
		left outer join
		(	select t2.Num, min(t2.Start_Date) as Start_Date, max(t2.End_Date) as End_Date
			from #T2 t2
			group by t2.Num
		) x on x.Num = t1.Num
		cross join (select 1 as N union all select 2) N

	union all

	select t21.Num,
		case when N.N = 1 then t21.Start_Date else dateadd(day, 1, t21.End_Date) end as Start_Date,
		case when N.N = 1 then t21.End_Date else dateadd(day, -1, t22.Start_Date) end as End_Date
	from #T2 t21
		left outer join #T2 t22 on t22.Num = t21.Num and t22.Start_Date > t21.Start_Date
		cross join (select 1 as N union all select 2) N
	where not exists(select * from #T2 t23 where t23.Num = t21.Num and t23.Start_Date > t21.Start_Date and t23.Start_Date < t22.Start_Date)
) y
where y.End_Date >= y.Start_Date;
18 мар 13, 14:15    [14062561]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?  [new]
elec
Member

Откуда:
Сообщений: 19
Гость333, спасибо.
18 мар 13, 17:56    [14063914]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить