2015-05-26 5 views
-1

У меня есть две таблицы СОТРУДНИК, КОМПАНИЯOracle SQL, Split Дата на основе даты перекрытия

EMPID START_DATE END_DATE 
123 1/05/2015 30/05/2015 




COMPANYID EMPID START_DATE END_DATE SALARY 
001   123 7/05/2015 15/05/2015 10000 

Мне нужно написать запрос, так что результат будет так,

COMPANYID EMPID START_DATE END_DATE SALARY 
001   123 1/05/2015 7/05/2015 0 
001   123 7/05/2015 14/05/2015 10000 
001   123 14/05/2015 30/05/2015 0 

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

+0

Вы должны написать код, который вы пробовали, чтобы люди могли вам помочь. – AlvaroSantisteban

+0

В первой таблице, откуда вы знаете, для чего предназначена компания EMPID? Ваша структура данных кажется неполной. –

ответ

0

Одним из вариантов является разделение сроков по частям, и разделить все возможности:

  1. от сотрудника даты начала до даты начала компании в случае, если они перекрывают друг друга
  2. от сотрудника даты начала до работника даты окончания в случае, если они не перекрывают друг друга
  3. от компании даты начала до даты окончания работника в случае, если дате окончания работников до даты конца компании
  4. с compoany даты начала до даты окончания компании в случае дате окончания работника после даты окончания компании и т.д.

Затем вы можете объединить все запросы вместе с «союзом всех», что приведет в запросе, как это (я мог забыть некоторые возможности):

select c.companyid 
, e.empid 
, e.start_date 
, e.end_date 
, 0 
from company c 
, employee e 
where e.empid = c.empid 
and e.end_date <= c.start_date 
union all 
select c.companyid 
, e.empid 
, e.start_date 
, c.start_date 
, 0 
from company c 
, employee e 
where e.empid = c.empid 
and e.start_date <= c.start_date 
and e.end_date > c.start_date 
union all 
select c.companyid 
, e.empid 
, c.start_date 
, e.end_date 
, c.salary 
from company c 
, employee e 
where e.empid = c.empid 
and e.start_date <= c.start_date 
and e.end_date > c.start_date 
and e.end_date <= c.end_date 
union all 
select c.companyid 
, e.empid 
, c.start_date 
, c.end_date 
, c.salary 
from company c 
, employee e 
where e.empid = c.empid 
and e.start_date <= c.start_date 
and e.end_date > c.end_date 
union all 
select c.companyid 
, e.empid 
, c.end_date 
, e.end_date 
, 0 
from company c 
, employee e 
where e.empid = c.empid 
and e.start_date <= c.start_date 
and e.end_date > c.end_date 

и результат be:

companyid empid start_date end_date salary 
1   123 5/1/2015 5/7/2015 0 
1   123 5/7/2015 5/15/2015 10000 
1   123 5/15/2015 5/30/2015 0