2013年(350)
分类: Oracle
2013-04-25 10:37:11
需求很简单,就是要模拟出 中 Add_Months 函数功能的一个自定义函数,函数中不能够调用任何oracle日期相关的函数,一切要靠自己计算,不考虑效率,只要求代码尽可能短~
就像nyfor版版说的,过程很有意思,就像玩游戏~~
只是,这个游戏花了我太多的时间了,从最初的1xxx字节到现在的405字节,这一个礼拜的心思全花在这上头了,周末也木有过好,晚上睡觉都在想着哪能再个把字节~~~
眼瞅5.1都到了,俺不玩鸟,给再多pub$俺也不玩鸟,俺要过个好五一啊~~~,现将代码贴出,供有心人士参考,希望能助有心人,踩着俺的肩膀更上一层楼~~
create or replace function my_add_months(p_date_string varchar2,
p_months number)
return varchar2 as
n int := p_date_string;
s int := 100;
y int := n / s / s;
m int := mod(n / s, s);
d int := mod(n, s);
begin
if d > 30 or d = 30 and m in (4, 6, 9, 11) or
m = 2 and d || mod(y, 4) > 280 then
d := 31;
end if;
n := m + p_months;
m := MOD(MOD(n, 12) + 11, 12) + 1;
y := Y + (n - m) / 12;
return y * s * s + m * s + case when m in (4, 6, 9, 11) and d > 30 then 30
when m != 2 or d < 29 then d
when mod(y / s, 4) = 0 or mod(y, 4) = 0 and mod(y, s) > 0 then 29
else 28 end;
end;
详情可见: 最小源代码擂台(测试结果收集中...)