表A,其中一列为登记时间,varchar2类型,格式是'YYYYMMDD',
就是说DJSJ这一列的数据以天为单位的,但其中可能缺少了某些天的记录,怎么找出缺少的天数来
。构建一含全部天数的临时表,然后用exists筛选吗?
如何构建这个时间段内含所有天数的临时表呢?

解决方案 »

  1.   


    SELECT B.DT
    FROM(
    SELECT '20101212' DJSJ FROM DUAL UNION ALL
    SELECT '20101224'  FROM DUAL UNION ALL
    SELECT '20101225'  FROM DUAL UNION ALL
    SELECT '20101226'  FROM DUAL UNION ALL
    SELECT '20101229'  FROM DUAL 
    ) A,
    (SELECT TO_CHAR(TO_DATE('20101201','YYYYMMDD')+ROWNUM-1,'YYYYMMDD') DT FROM DUAL CONNECT BY ROWNUM<32) B
    WHERE B.DT=A.DJSJ(+)
      AND A.DJSJ IS NULL
    ORDER BY B.DT
      

  2.   


    ---先使用你的最小时间到现在构造虚表,然后minus
    SQL> 
    SQL> with taba as(
      2  select '20101215' DJSJ from dual union all
      3  select '20101218' from dual union all
      4  select '20101220' from dual
      5  )
      6  select to_char(to_date(DJSJ, 'yyyymmdd') + rownum - 1, 'yyyymmdd') DJSJ
      7    from taba
      8  connect by rownum <= sysdate - to_date('20101215', 'yyyymmdd')
      9  minus
     10  select DJSJ from taba
     11  ;DJSJ
    --------
    20101216
    20101217
    20101219
    20101221
    20101222
    20101226
    201012297 rows selectedSQL> 
      

  3.   

    貌似没有难度
    构建一个临时表,然后两个表minus,这样最简单,
    不用minus就用exists,
      

  4.   


    恩,已经实现了,现在有个新需求。怎么从A中取得离缺数据那天最近的日期,比如
    A中有2010-12-03,2010-12-07,的数据,
    那么缺数据的是2010-12-04,2010-12-05,2010-12-06三天的,要分别取离这三天的最近的A中的记录
    就应该是2010-12-03,2010-12-03(舍去2010-12-07),2010-12-07
    怎么获得这三个日期??
      

  5.   

    思路,
    1.选定一个日期每次减1,如果存在于临时表,继续减1,如果存在于你的日期表,返回第一个日期,结束循环
    2.选定一个日期每次加1,如果存在于临时表。继续加1,如果存在于你的日期表,然会第一个日期,结束循环
    3.两个日期同你当前选定的日期比较,选出最小值,如果两个差值相等,去小的日期。---------考验你的时候到了。。呵呵good luck...
      

  6.   


    递归构建临时表 在existsselect substr(dt,1,6)||lpad(level,2,'0')
    from dual
    connect by level<=(select to_char(last_day(to_date('某个时间','yyyy-mm-dd')),'dd') from dual)