最近项目出现了一个很奇怪的问题,因为是数据迁移的。(旧表中的数据,导入到多个表中(简单拿周计划表来说,一个主表,一个周计划从表,主外键,主表中一条记录,从表中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,周次(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条记录中的时间,却不知道怎么去改为相应的了。 希望,曾经有遇到过类似过,或者高手,能帮忙分析一下。
在此,谢谢了。。
有点急哈。。
仅供参考: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;
http://topic.csdn.net/u/20100909/10/4fbfb6cd-c207-4c67-b28a-ecf31810a672.html
看看这个 我最后的回复 也许有帮助