`
sangei
  • 浏览: 342238 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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中访问联合数组。

    在Oracle数据库的PL/SQL环境中,联合数组(Varying Array)是一种特殊的变量类型,它允许程序员存储一组相同类型的元素,这些元素可以是数值、字符串或其他复杂的数据类型。联合数组在PL/SQL中扮演着重要角色,特别...

    判断闰年 c#

    在编程领域,闰年的判断是基础的算法问题之一,尤其在学习C#语言时经常会遇到。闰年的定义是:能被4整除但不能被100整除,或者能被400整除的年份。这个规则适用于公元1582年之后的格里高利历。下面我们将深入探讨...

    PLSQL经典培训教程

    21. **闰年判断函数**: - 函数接收一个年份参数,如果该年份能被4整除但不能被100整除,或者能被400整除,则返回1,否则返回0。 这个教程覆盖了SQL语言的基础,Oracle 8i的高级特性以及PL/SQL编程,包括了SQL的...

    时间维度生成程序

    文件"Time_Dim.PackageBody.sql"和"Time.Dim.Package.sql"可能涉及到PL/SQL包,这是Oracle数据库中的一种高级编程结构,用于组合相关的存储过程和函数。"PackageBody.sql"通常包含包体,即实际的代码实现,而...

    PL.SQL.Developer.v8.0.3.1510(带注册机,2010年4月29日测试有效)

    这个专门搞oracle开发的朋友都应该知道是什么吧,注意提示一点,不要把它和oracle出的sql developer搞错了,这个是plsql developer,相信大家都应该用过。请下载试用吧,刚刚(2010年4月29日14:35:40)测试有效。

    oracle日历转化成农历

    要实现这个功能,我们可以创建一个自定义的PL/SQL函数,如下所示: ```sql CREATE OR REPLACE FUNCTION convert_to_lunar ( p_gregorian_date DATE ) RETURN DATE DETERMINISTIC AS -- 内部变量,用于存储农历...

    根据生日获取年龄及年龄单位的oracle存储过程

    在Oracle数据库系统中,存储过程是一种预编译的SQL和PL/SQL代码集合,用于执行特定的任务。在本例中,我们关注的是一个名为“根据生日获取年龄及年龄单位的oracle存储过程”的功能,它的主要任务是计算输入日期...

    Oracle日期之二

    在SQL查询和PL/SQL程序中,日期处理是常见的任务,例如计算日期间隔、获取当前日期、格式化日期显示等。Oracle提供了多种内置函数和操作符来处理日期,使得这些任务变得简单。 1. **日期数据类型** Oracle中的日期...

Global site tag (gtag.js) - Google Analytics