日期:2014-05-17  浏览次数:20894 次

怎样统计一天中的可用时长
起        止
08:00    09:00
10:00    10:30
10:10    11:00

这张表的意思是一天中不可用的起止时间。
根据这张表的值,我怎样用函数计算一天中的可用时间长度?
这些时间段可能会有交叉,或者包含关系(如:10:00-10:30 11:00-11:30 09:30-12:00)。

最笨的方法是用1440条记录,但这个效率实在是...
用游标,如果没有包含关系还好办,有了包含,头大...
期待高手...
------解决方案--------------------
WITH sj AS
(SELECT TO_CHAR(S_DT + (ROWNUM - 1) * 1 / 1440, 'hh24:mi') dd
   FROM (SELECT TO_DATE('00:00', 'hh24:mi') S_DT,
                TO_DATE('23:59', 'hh24:mi') E_DT
           FROM DUAL) T 
 CONNECT BY S_DT + (ROWNUM - 1) * 1 / 1440 <= E_DT)
SELECT COUNT(1) FROM sj WHERE 
not(dd>'08:00' AND dd<'09:00') AND 
not(dd>'10:00' AND dd<'10:30') AND 
not(dd>'10:10' AND dd<'11:20')