Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1239587
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

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;

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


阅读(604) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~