这是一个老调重弹的例子,也许以前写过这样的笔记,这里再贴出来,是再次感叹于其解决方法的美妙行。
判断一个年份是闰年,常见的想法是判断其是否可被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
当然,这个方法不是我原创的,但其抓住问题的本质的解决方法的确令人佩服,所以解决任何问题之前,必须首先了解问题的真正含义,不要为解决问题而解决问题。
分享到:
相关推荐
在Oracle数据库的PL/SQL环境中,联合数组(Varying Array)是一种特殊的变量类型,它允许程序员存储一组相同类型的元素,这些元素可以是数值、字符串或其他复杂的数据类型。联合数组在PL/SQL中扮演着重要角色,特别...
在编程领域,闰年的判断是基础的算法问题之一,尤其在学习C#语言时经常会遇到。闰年的定义是:能被4整除但不能被100整除,或者能被400整除的年份。这个规则适用于公元1582年之后的格里高利历。下面我们将深入探讨...
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"通常包含包体,即实际的代码实现,而...
这个专门搞oracle开发的朋友都应该知道是什么吧,注意提示一点,不要把它和oracle出的sql developer搞错了,这个是plsql developer,相信大家都应该用过。请下载试用吧,刚刚(2010年4月29日14:35:40)测试有效。
要实现这个功能,我们可以创建一个自定义的PL/SQL函数,如下所示: ```sql CREATE OR REPLACE FUNCTION convert_to_lunar ( p_gregorian_date DATE ) RETURN DATE DETERMINISTIC AS -- 内部变量,用于存储农历...
在Oracle数据库系统中,存储过程是一种预编译的SQL和PL/SQL代码集合,用于执行特定的任务。在本例中,我们关注的是一个名为“根据生日获取年龄及年龄单位的oracle存储过程”的功能,它的主要任务是计算输入日期...
在SQL查询和PL/SQL程序中,日期处理是常见的任务,例如计算日期间隔、获取当前日期、格式化日期显示等。Oracle提供了多种内置函数和操作符来处理日期,使得这些任务变得简单。 1. **日期数据类型** Oracle中的日期...