pl/sql 判断闰年

这是一个老调重弹的例子,也许以前写过这样的笔记,这里再贴出来,是再次感叹于其解决方法的美妙行。
判断一个年份是闰年,常见的想法是判断其是否可被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
当然,这个方法不是我原创的,但其抓住问题的本质的解决方法的确令人佩服,所以解决任何问题之前,必须首先了解问题的真正含义,不要为解决问题而解决问题。

你可能感兴趣的:(pl/sql,闰年)