这是一个老调重弹的例子,也许以前写过这样的笔记,这里再贴出来,是再次感叹于其解决方法的美妙行。
判断一个年份是闰年,常见的想法是判断其是否可被4整除,如果是100的倍数,要求其能被400整除。
下面是摘自DBA_Village的例子:
create or replace function IS_LEAP_YEAR (nYear in number) return boolean
is
V_REMAINDER1 NUMBER(5,2);
V_REMAINDER2 NUMBER(5,2);
V_REMAINDER3 NUMBER(5,2);
BEGIN
V_REMAINDER1 := MOD(nYear,4);
V_REMAINDER2 := MOD(nYear,100);
V_REMAINDER3 := MOD(nYear,400);
IF ((V_REMAINDER1 = 0 AND V_REMAINDER2 <> 0 ) OR V_REMAINDER3 = 0) THEN
DBMS_OUTPUT.PUT_LINE(nYear || ' is a leap year');
return true;
ELSE
DBMS_OUTPUT.PUT_LINE (nYear || ' is not a leap year');
return false;
END IF;
END;
实际上,我们判断一个年份是否是闰年,主要是2月29号这个日期,如果反过来,如果该年存在这么一天,那么不就是闰年了? ,例子:
SQL> Create Or Replace Function Is_Leap_Year(nYear number) return number
2 is
3
4 v_test_date Varchar2(8) ;
5 v_date date ;
6 begin
7 v_test_date := to_char(nYear)||'0229';
8
9 begin
10 v_date := to_date(v_test_date, 'yyyymmdd') ;
11 return 1 ;
12 Exception
13 when others then
14 return 0 ;
15 End ;
16 End ;
17 /
Function created.
SQL>
SQL> show error
No errors.
SQL>
SQL> select Is_Leap_Year(2000) from dual ;
IS_LEAP_YEAR(2000)
------------------
1
SQL> select Is_Leap_Year(2001) from dual ;
IS_LEAP_YEAR(2001)
------------------
0
SQL> select Is_Leap_Year(1900) from dual ;
IS_LEAP_YEAR(1900)
------------------
0
当然,这个方法不是我原创的,但其抓住问题的本质的解决方法的确令人佩服,所以解决任何问题之前,必须首先了解问题的真正含义,不要为解决问题而解决问题。