PL / SQL程序用于计算年龄以及您的生日年份是否为闰年

时间:2013-02-06 10:02:48

标签: oracle plsql

所以这个问题似乎在编程类中以各种形式提出。我已经看到这个问题与触发器,功能等。我已经计算了该计划的闰年部分,并且有几种不同的方法可以计算您生日的年龄,无论是除以365.25还是间隔月数,可能还有其他几种方法来解决这个问题。

我只是在我的Age计算方面遇到了一些问题,并且在其他程序中执行此操作时会出现信息过载,并且特别是在针对Oracle Dev的PL / SQL中进行编程。

这个展示了如何在SQL SERVER中完成:calculating age from sysdate and birthdate using SQL Server

这个使用触发器,它类似但不完全是我正在寻找的。 Calculating age from birthday with oracle plsql trigger and insert the age in table

  

写一个PL / SQL块来接受你的生日。计算和打印   你的年龄,包括一个小数点。还检查是否   你的出生年份是否是闰年。打印“我的   出生年份是闰年。“或”我的出生年份不是一个飞跃   “提示:要确定闰年,这一年应该是正确的   可被4整除但不能被100整除,或者它应该是   可以被400整除。

SET SERVEROUTPUT ON
DECLARE
   v_birthday_year        NUMBER(4)    := &v_birthday_year;
   v_your_age             NUMBER(4, 1);
   v_leap_remainder1      NUMBER(5, 2);
   v_leap_remainder2      NUMBER(5, 2);
   v_leap_remainder3      NUMBER(5, 2);

 BEGIN
   v_leap_remainder1 := MOD(v_birthday_year, 4);
   v_leap_remainder2 := MOD(v_birthday_year, 100);
   v_leap_remainder3 := MOD(v_birthday_year, 400);

 IF ((v_leap_remainder1 = 0 AND v_leap_remainder2 <> 0 ) 
     OR v_leap_remainder3 = 0) 
 THEN
   DBMS_OUTPUT.PUT_LINE(v_birthday_year || ' is a leap year');

 ELSE
   DBMS_OUTPUT.PUT_LINE (v_birthday_year || ' is not a leap
   year');

  END IF;


  TO_CHAR(SYSDATE, 'DD-MM-YYYY')
  v_your_age := (MONTHS_BETWEEN(TRUNC(SYSDATE), v_birthday_year)/12);
  DBMS_OUTPUT.PUT_LINE ('Your age is ' || v_your_age);

 END;
 /

实际上我弄清楚了,这是dob的to_date转换,birthyear的单独变量,dob和age。年龄计算为1位小数。 Trunc(x,1)现在效果很好。

1 个答案:

答案 0 :(得分:1)

您也可以尝试通过转换为Julian日期来检查它。将时间戳转换为Julian日期时,您将获得自公元前-4000年之前的某个日期以来的天数。如果您计算两个日期之间的差异,您就知道这些日期之间的天数。所以在你出生的一年的1月1日和12月31日这样做,你会知道它是否是闰年。

为了计算年龄,请检查函数months_between(查看this question的最后一个答案)。