最近项目出现了一个很奇怪的问题,因为是数据迁移的。(旧表中的数据,导入到多个表中(简单拿周计划表来说,一个主表,一个周计划从表,主外键,主表中一条记录,从表中7条记录))
 简单描述一下有关表字段,
主表中,主键1,周次(37),提交时间,开始时间(每个星期的那天日前,如2010-09-13),结束日期(2010-09-19)
 
从表中,外键1,日期字段
(存的值如:1,2010-09-13,
           1,2010-09-14
           1,2010-09-15
           1,2010-09-16
            1,2010-09-17
          1,2010-09-18
          1,2010-09-19)
    但是在insert到新表的时候,老是报错, 移植的原理是,先清除新表中的数据,查询旧表中的数据,把每一条记录中的每个字段保存到request
,然后插入到新表中,
其中在执行的时候,可能是因为有些时间为空,
老是报nullpoint,后来被组长改了,就好了,但是执行完成后,
去发现主表中起始日期和结束日期很多为空,但是还好,那个提交日期还在,
后来组长通过sql语句,把其转换为相应的每周中的日期。 今天客户提出,很多时间不对,自己去看数据的时候,确实很多数据没有对上来。
 现在主表中还是可以解决,但是从表中7条记录中的时间,却不知道怎么去改为相应的了。  希望,曾经有遇到过类似过,或者高手,能帮忙分析一下。
       在此,谢谢了。。
 有点急哈。。

解决方案 »

  1.   


    仅供参考:http://topic.csdn.net/u/20100805/17/19ef4c7b-f7d4-4b35-9d89-038867c59f7d.html?36006
    月周:
    SQL code
    CREATE OR REPLACE FUNCTION week_month(p_date DATE) RETURN NUMBER IS
            v_Result  NUMBER;
            v_datestr VARCHAR2(10);
            v_weekday NUMBER;
    BEGIN
            v_datestr := to_char(p_date, 'yyyyMMdd');
            SELECT (TO_NUMBER(TO_CHAR(TO_DATE(SUBSTR(v_datestr, 1, 6) || '01', 'YYYYMMDD'), 'D'),
                                                 99) - 1)
                INTO v_weekday
                FROM dual;
            IF v_weekday = 0 THEN
                    v_weekday := 7;
            END IF;
            SELECT ceil((TO_NUMBER(SUBSTR(v_datestr, -2), 99) + v_weekday-1) / 7)
                INTO v_Result
                FROM dual;
            RETURN v_Result;
    END;
    年周:
    SQL code
    CREATE OR REPLACE FUNCTION UDF_WEEKOFYEAR ( V_DATE DATE )  RETURN number
    is
    v_ret1 NUMBER;BEGIN SELECT TO_CHAR
           (DECODE
            (SIGN
             ((V_DATE
              + TO_NUMBER
              (DECODE(TO_CHAR(TRUNC(V_DATE,
                                       'YYYY'
                                       ),
                                 'D'
                                 ),
                         '1',
                         '8',
                         TO_CHAR(TRUNC(V_DATE,
                                       'YYYY'
                                       ),
                                 'D'
                                 )
                         )
                  )
              - 2
              )
              - LAST_DAY(V_DATE)
              ),
             1,
             LAST_DAY(V_DATE),
             (V_DATE
             + TO_NUMBER(DECODE(TO_CHAR(TRUNC(V_DATE,
                                               'YYYY'
                                               ),
                                         'D'
                                         ),
                                 '1',
                                 '8',
                                 TO_CHAR(TRUNC(V_DATE,
                                               'YYYY'
                                               ),
                                         'D'
                                         )
                                 )
                          )
             - 2
             )
             ),
            'WW'
            )
      into v_ret1
      FROM DUAL;  return v_ret1;
    END;
      

  2.   


    http://topic.csdn.net/u/20100909/10/4fbfb6cd-c207-4c67-b28a-ecf31810a672.html
    看看这个 我最后的回复 也许有帮助
      

  3.   

    已经解决。谢谢。通过Java程序进行更新的 。在这个操作中,学到了不少的东西。尽量少在循环中反复进行select,提高速度,建索引