我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。
本博客所有内容均为原创,如有转载请注明作者和出处
不使用日期函数实现ADD_MONTHS函数功能(二)
上一篇 /
下一篇 2008-05-31 23:53:38
/ 个人分类:ORACLE
看到开发区的nyfor版主出了一道题,用PL/SQL实现Oracle的ADD_MONTHS的功能,觉得比较有意思,忍不住尝试了一下。
原文如下:http://www.itpub.net/thread-977079-1-1.html
不使用日期函数实现ADD_MONTHS函数功能:http://yangtingkun.itpub.net/post/468/460788
在原有的基础上做了一点小改动。
由于这个东西比较耗费精力,因此自从上次的函数实现之后就没有再花功夫去研究。
不过从其他人那里学到了一个函数的用法,可以在不改变现有算法的情况下,再次减少源代码的长度:
SQL> CREATE OR REPLACE FUNCTION MY_ADD_MONTHS(P_DATE_STRING VARCHAR2, P_MONTHS NUMBER)ITPUB个人空间s#yqx&G$G(gQ
2 RETURN VARCHAR2 AS
i/p;j"]Q^0 3 SUBTYPE I IS INT;ITPUB个人空间H'T0{ il5G)zh|E
t
4 N I:=P_DATE_STRING;
-c)Ij_-EXad_0 5 C I:=100;ITPUB个人空间/[.t L4ZsD8[
6 D I:=N MOD C;
FR#q3W4S9k(j0 7 Y I:=N/C/C;ITPUB个人空间7D[;V(Td9u/n'S e&Zb
8 M I:=N/C MOD C;ITPUB个人空间:F+lk5yrPZE%Wr
9 Z I:=M+P_MONTHS;ITPUB个人空间9S(r!Y$ZB0B7d%Fk0KKL
10 FUNCTION F(Y I,M I) RETURN IITPUB个人空间&v
q
Q1MsS&[2R
11 ASITPUB个人空间8vDULKL
12 BEGIN
aRX+@@1}0 13 RETURN 31-CASE WHEN M IN(4,6,9,11) THEN 1
8B}q)QP|9oZv0 14 WHEN M!=2 THEN 0ITPUB个人空间6p!mn*A&e
D&T^
15 WHEN Y MOD 400 = 0 OR Y MOD 4 = 0 AND Y MOD C > 0 THEN 2
NE&Gd%C
^,Hp0 16 ELSE 3
`2@'t? ]Y.s?0 17 END;ITPUB个人空间^GA/t6CH
18 END;
#~HVw ~ \+R^'j/XEC]#K0 19 BEGIN
X
Tz7B1k
^Npl0 20 N:=(Z MOD 12 + 11) MOD 12 + 1;ITPUB个人空间%S$b @*{+mM(]M
21 Z:=Y+(Z-N)/12;