扫地不过是我表面上的工作,我真正的身份其实是无名老僧-----------手里那根扫把~

My_add_months,开发版nyfor版版的小游戏:)

上一篇 / 下一篇  2008-04-30 11:08:51 / 个人分类:三思笔记

需求很简单,就是要模拟出 Oracle 中 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;

详情可见: 最小源代码擂台(测试结果收集中...)


TAG: oracle 学习 优化

zhangweicai74的个人空间 引用 删除 zhangweicai74   /   2008-04-30 14:11:27
评错分,应该是3分
zhangweicai74的个人空间 引用 删除 zhangweicai74   /   2008-04-30 14:10:04
1
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar