欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pl/sql 判断闰年 博客分类: oracle sql pl/sql闰年 

程序员文章站 2024-03-16 21:33:04
...

这是一个老调重弹的例子,也许以前写过这样的笔记,这里再贴出来,是再次感叹于其解决方法的美妙行。
判断一个年份是闰年,常见的想法是判断其是否可被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 闰年