一个项目有14个工作流程,每个流程需要在一定的工作日内办结,否则超时;
工作日可以自定义的;
现在希望得出各项目在各流程中超时的信息;
现在三张表:wf_instance、wf_node、workingTime
wf_instance是保存各项目流程信息的表,包括流程的起始时间(date类型)结束时间
wf_node是保存个流程的表,包括规定的超时天数(int 类型 如:1,2,3等)
workingTime是保存工作日的表,存储的数据为日期(VARCHAR2类型,如:2011-05-02,2011-05-03,)逗号分隔的字符串
因为想得到得到各环节的超时信息,一个项目各个流程用合并单元格的形式
所以需要从数据库方向着手分页显示数据,oralce不是很明白
求高手指定方法或者思路,主要是计算超时的部分

解决方案 »

  1.   

    1、流程表只有起始通知时间和结束操作时间(主要用来判断两个时间相差天数是否超过规定工作日)以及一些流程回转和下一阶段流程等相关信息,还不能确定是否超时;如果加一个字段标识超时,如果此阶段流程长时间无人操作造成超时也是问题(起始通知时间在创建此流程时系统写入当时时间;结束操作时间是在操作完成后写入,默认为空,即当前时间),所以需要写一个存储进行判断
    2、你说的那张表就是wf_node这个表
    至于建议,哥们我没有数据库修改权,加个字段啥的还可以,动整个表结构没那个权限,而且修改东西太多
      

  2.   

    花了点时间还是解决这个问题了-- split函数 
    CREATE OR REPLACE FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
        RETURN str_split 
        PIPELINED
    AS
        v_length   NUMBER := LENGTH(p_string);
        v_start    NUMBER := 1;
        v_index    NUMBER;
    BEGIN
        WHILE(v_start <= v_length)
        LOOP
            v_index := INSTR(p_string, p_delimiter, v_start);        IF v_index = 0
            THEN
                PIPE ROW(SUBSTR(p_string, v_start));
                v_start := v_length + 1;
            ELSE
                PIPE ROW(SUBSTR(p_string, v_start, v_index - v_start));
                v_start := v_index + 1;
            END IF;
        END LOOP;    RETURN;
    END splitstr;--调用字符分隔符
    select count(*) days
      from table(splitstr('2011-12-17,2011-12-18,2011-12-19,2011-12-20,2011-12-21,2011-12-22,2011-12-23,2011-12-24,',','))
     where column_value>'2011-12-18' and column_value<'2011-12-22';
      

  3.   

    问题是在oracle里面,计算两个时间之间的间隔数;
    这个时间是有序的但不是连续的,用“,”分隔的时间字符串;
    例如楼上所示的调用例子
      

  4.   

    with a as(select '2011-12-17,2011-12-18,2011-12-19,2011-12-20,2011-12-21,
    2011-12-22,2011-12-23,2011-12-24,' sj from dual)
    select max(to_date(s_J,'yyyy/mm/dd'))-min(to_date(s_J,'yyyy/mm/dd')) from(select regexp_substr(sj,'[^,]+',1,rownum) s_j from a
    connect by rownum<=length(regexp_replace(sj,'[^,]+')))