目前在做一个数据处理,源表名叫alarm有这样几列senname,alarmnum,alarmtime,idx等(用到的就是这几列,分别表示数据名、报警信息、报警时间和标志位)。里面的数据都是一行一行的互不重复,一共18行(idx,从1到16是雨量,17/、18是水位)比如(其中三行)
senname,   ||| alarmnum,   |||    alarmtime,       |||    idx
站点1       |||  38          |||  2010-9-1 16:00:00  |||      1
站点2       |||  40          |||  2010-8-27 00:00:00 |||      2
站点3       |||  3.9         |||  2010-9-1 16:00:00  |||     17
我需要一个存储过程,把与系统时间相差5分钟之内的这几行数据合并,并写到另外一个表alarmlog内比如当前时间是2010-9-1 16:03分,合并后的数据应该是senid,|||                         alarmlog   ,                                 |||        alarmtime
10000  |||  XX区汛情信息 2010-9-1 16:00:站点1   雨量 38毫米,站点3  水位 3.9米,|||   2010-9-1  16:03:00到16点08分再运行这个脚本,就啥都不发生,数据还是一样的这个好像有点开发量,我以前是做自控的,现在在转软件,在sql下我以前实现过,现在在oracle,很头疼,大虾们帮我开个头,我后面十几条数据我自己可以并

解决方案 »

  1.   

    select senname,alarmnum,alarmtime,idx from tablename where (to_number(to_char(sysdate,MI)) - to_number(to_char(alarmtime,MI)) <5 OR (_number(to_char(sysdate,MI)) - to_number(to_char(alarmtime,MI)) = 5 AND to_number(to_char(sysdate,SS)) - to_number(to_char(alarmtime,SS)) <= 0));给你一个思路,第一个条件是满足 时间相差小于5分钟,那么肯定在5分钟内, 第二个条件为时间相差正好等于5分钟,这时候继续判断秒是否符合条件,只需要系统时间的秒小于记录时间,则就表示在五分钟内.
      

  2.   

    取指定时间内的数我自己可以实现,我现在愁的是如何合并...以前用sql的时候直接用临时变量往起拼就行了,现在不知道怎么拼...
      

  3.   

    你如果用的是10g的话可以这样做
    SELECT '10000 ||| XX区汛情信息 '||
    wm_concat(to_char(alarmtime,'yyyy-mm-dd hh24:mi')||' '||senname||decode(idx,1,'雨量 ',17,'水位 ')||alarmnum||decode(idx,1,'毫米 ',17,'米 ')||
    ' ||| '||to_char(SYSDATE,'yyyy-mm-dd hh24:mi')
     FROM TABLE 
     WHERE alarmtime>=SYSDATE-5/24/60
      

  4.   

    上面的少写了个括号.SELECT '10000 ||| XX区汛情信息 '||
    wm_concat(to_char(alarmtime,'yyyy-mm-dd hh24:mi')||' '||senname||decode(idx,1,'雨量 ',17,'水位 ')||alarmnum||decode(idx,1,'毫米 ',17,'米 '))||
    ' ||| '||to_char(SYSDATE,'yyyy-mm-dd hh24:mi')
     FROM TABLE  
     WHERE alarmtime>=SYSDATE-5/24/60
    另外你还可以用递归查询来实现,麻烦些,但是通用.
      

  5.   

    WITH t AS (SELECT to_char(alarmtime,'yyyy-mm-dd hh24:mi')||' '||senname||decode(idx,1,'雨量 ',17,'水位 ')||alarmnum||decode(idx,1,'毫米 ',17,'米 ') content,row_number()over(ORDER BY alarmtime ASC) rn
     FROM TABLE  WHERE alarmtime>=SYSDATE-5/24/60 )   
     SELECT  '10000 ||| XX区汛情信息 '||SYS_CONNECT_BY_PATH(content ,',')))||
    ' ||| '||to_char(SYSDATE,'yyyy-mm-dd hh24:mi')
     FROM t WHERE connect_by_isleaf=1 START WITH rn=1 CONNECT BY PRIOR t.rn=t.rn-1