Oracle SQL,基于日期重叠的分割日期

时间:2015-05-26 10:53:04

标签: sql oracle date

我有两张表EMPLOYEE,COMPANY

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

类似地,查询应该适用于所有类型的重叠 - 部分和完整。请帮忙。

1 个答案:

答案 0 :(得分:0)

一种选择是将时间线分成几部分,并将所有可能性分开:

  1. 从员工开始日期到公司开始日期以防重叠
  2. 从员工开始日期到员工结束日期(如果不重叠)
  3. 从公司开始日期到员工结束日期,以防员工结束日期在公司结束日期之前
  4. 从公司开始日期到公司结束日期,以防员工结束日期在公司结束日期之后 等
  5. 然后你可以将所有查询与“union all”一起加入,这将产生这样的查询(我可能已经忘记了一些可能性):

    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
    

    ,结果将是:

    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
    
相关问题