一table,开始和结束时间
start_time  ||  end_time  
  8:30      ||   12:00
 12:30      ||   17:00
 17:30      ||   22:3012:00--12:30,17:00--17:30 这是休息时间;另外一个表记录时间
curtime
8:45
8:55
11:09
14:00
16:00
18:00
18:50
19:00想根据第一个表求出表二的实际工作时间,
比如,  到了 14:00,实际工作时间为14:00 - 8:30 - 30'(休息时间)=3H;
             19:00,实际工作时间为19:00-8:30-30'-30’=10.5H;

解决方案 »

  1.   

    select b.curtime,
      nvl(sum(a1.end_time-a1.start_time),0)+nvl(max(b.curtime-a2.start_time),0) total
    from a a1,a a2,b
    where b.curtime>a1.end_time(+)
    and b.curtime>a2.start_time(+) and
    b.curtime<=a2.end_time(+)
    group by b.curtime
    时间如果不是date型的自己要转一下
      

  2.   

    SELECT (TO_DATE(curtime,'hh24:mi') - TO_DATE((SELECT TO_CHAR(MIN(TO_DATE(start_time,'hh24:mi')),'hh24:mi') FROM tb1),'hh24:mi'))*24 - 
    (CASE WHEN TO_DATE(curtime,'hh24:mi') > TO_DATE((SELECT TO_CHAR(MAX(TO_DATE(end_time,'hh24:mi')),'hh24:mi') FROM tb1),'hh24:mi') THEN 2 WHEN TO_DATE(curtime,'hh24:mi') < TO_DATE((SELECT TO_CHAR(MIN(TO_DATE(end_time,'hh24:mi')),'hh24:mi') FROM tb1),'hh24:mi') THEN 0 ELSE 1 END)*0.5 
    FROM tb2
      

  3.   

    如果直接得出下面的结果呢
    curtime   XXX
    8:45     8:45
    8:55     8:55
    11:09    11:09
    14:00    13:30
    16:00    15:30 
    18:00    17:00
    18:50    17:50
    19:00    18:00 
      

  4.   

    SELECT curtime,(TO_DATE(curtime,'hh24:mi') - TO_DATE((SELECT TO_CHAR(MIN(TO_DATE(start_time,'hh24:mi')),'hh24:mi') FROM tb1),'hh24:mi'))*24 - (CASE WHEN TO_DATE(curtime,'hh24:mi') > TO_DATE((SELECT TO_CHAR(MAX(TO_DATE(end_time,'hh24:mi')),'hh24:mi') FROM tb1),'hh24:mi') THEN 2 WHEN TO_DATE(curtime,'hh24:mi') < TO_DATE((SELECT TO_CHAR(MIN(TO_DATE(end_time,'hh24:mi')),'hh24:mi') FROM tb1),'hh24:mi') THEN 0 ELSE 1 END)*0.5 AS "XXX(H)" FROM tb2