使用时间加入以产生多行

时间:2012-03-16 20:50:35

标签: sql oracle join

我有一个相当棘手的情况(至少对我而言)。我正在尝试编写一个SQL语句,它将采用一个看起来像的事件表:

Event   HourId      Start                  End
Event1  1203170200  3/17/2012 02:30:00 PM  3/17/2012 04:15:00 PM

加入一个类似

的日历表
HourId      Start                  End
1203170200  3/17/2012 02:00:00 PM  3/17/2012 02:59:59 PM  
1203170300  3/17/2012 03:00:00 PM  3/17/2012 03:59:59 PM  
1203170400  3/17/2012 04:00:00 PM  3/17/2012 04:59:59 PM  
1203170500  3/17/2012 05:00:00 PM  3/17/2012 05:59:59 PM  

我希望结果成为事件跨越的每个小时的记录:

Event   HourId      Start                  End
Event1  1203170200  3/17/2012 02:30:00 PM  3/17/2012 04:15:00 PM
Event1  1203170300  3/17/2012 02:30:00 PM  3/17/2012 04:15:00 PM
Event1  1203170400  3/17/2012 02:30:00 PM  3/17/2012 04:15:00 PM

仅仅是一个小时的清单是不够的,我已经能够做到这一点。我需要得到上述格式的结果,以便在另一种算法中使用。任何人都可以建议一些可以实现此目的的SQL吗?

4 个答案:

答案 0 :(得分:1)

SELECT
  e.Event,
  c.HourId,
  e."Start",
  e."End"
FROM Events e
  INNER JOIN Calendar c ON c."Start" <= e."End"
                       AND e."Start" <= c."End"

答案 1 :(得分:0)

SELECT T1.Event,T1.HourId,T1.Start,T1.End
FROM Table1 T1,Table2 T2
WHERE T1.HourId=T2.HourID;

答案 2 :(得分:0)

select 
    e.event,
    c.hourid,
    e.start,
    e.end
from event e
inner join calendar c on 
    e.start between c.start and c.end 
    or 
    e.end between c.start and c.end
    or
    trunc(e.start, 'hour') <= trunc(c.start, 'hour') 
    and 
    trunc(e.end, 'hour') >= trunc(c.end, 'hour')
order by c.hourid

答案 3 :(得分:0)

试试这个:

select ee.event,cc.hourId,ee.start,ee.end
from calend cc 
join event ee on (cc.Start between ee.Start and ee.end) or 
                 (cc.EndD between ee.Start and ee.End)