|
原帖由 DragonBill 于 2008-5-27 10:18 发表 ![]()
更新至 318 Byte, 但该方法存在一个小Bug
如果允许0年{0,1}月这种格式存在的话, 该 Function 存在错误
注意我红色标出的地方, 用了 Z < 2 作判断
常规情况下, Y * 12 + M + p_months(即Z的初始值), 应该是一定大于1的,
但如果出现下列情况:
p_date_string = 16000101, p_months = -19200(或是-19201, -19202, etc.)
那么就会出现程序错误.
但是反过来考虑, 如果出现以上的情况,
就意味着最后得出的年月一定为0(或者是负数)年{0,1}月, 这种格式事实上是不存在的.
就本题给出的种种规则来看, 我认为这种写法是可行的
--Congratulation ... Code Length: 318 Bytes. Times: 00:00:08
create or replace function my_add_months(p_date_string varchar2,
p_months number)
return varchar2
AS
C INT := p_date_string;
H INT := 100;
Y INT := C/H/H;
M INT := C/H - Y * H;
D INT := C MOD H;
Z INT := Y * 12 + M + p_months;
BEGIN
LOOP
C := 27 + SUBSTR(43434434341 + 0 ** (Y MOD (4 + 12 * 0 ** (Y MOD H))), 1 - M, 1);
EXIT WHEN Z < 2;
Y := (Z - 7) / 12;
M := Z - Y * 12;
Z := D/C/2;
END LOOP;
RETURN Y * H * H + M * H + LEAST(C, Z || D);
END;
/
真是PF得不行了.... |
|