从出生日期到今天的Oracle年龄计算

And*_*eda 21 oracle datetime

我想在我的Oracle函数中计算出生日期的当前年龄.

我正在使用的是(Today-Dob)/30/12,但这不准确,因为有些月份有31天.

我需要以最高精度获得正确的年龄.我怎样才能做到这一点?

小智 44

SQL> select trunc(months_between(sysdate,dob)/12) year,
  2         trunc(mod(months_between(sysdate,dob),12)) month,
  3         trunc(sysdate-add_months(dob,trunc(months_between(sysdate,dob)/12)*12+trunc(mod(months_between(sysdate,dob),12)))) day
  4  from (Select to_date('15122000','DDMMYYYY') dob from dual);

      YEAR      MONTH        DAY
---------- ---------- ----------
         9          5         26

SQL>
Run Code Online (Sandbox Code Playgroud)


Jef*_*emp 14

对于业务逻辑,我通常会发现十进制数(以年为单位)很有用:

select months_between(TRUNC(sysdate),
                      to_date('15-Dec-2000','DD-MON-YYYY')
                     )/12
as age from dual;

       AGE
----------
9.48924731
Run Code Online (Sandbox Code Playgroud)

  • AskTOM(Connor McDonald)说,它在极少数情况下会失败:https://asktom.oracle.com/pls/apex/f?p=100:11:::NO:RP:P11_QUESTION_ID:9531934000346471628推荐以下方法:trunc( (to_number(to_char(现在,'YYYYMMDD'))-to_number(to_char(出生,'YYYYMMDD')))/ 10000) (2认同)

小智 10

SELECT 
TRUNC((SYSDATE - TO_DATE(DOB, 'YYYY-MM-DD'))/ 365.25) AS AGE_TODAY FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

这很简单直接.


pro*_*ota 8

人的年龄(整年):

SELECT
  TRUNC(months_between(sysdate, per.DATE_OF_BIRTH) / 12) AS "Age"
FROM PD_PERSONS per
Run Code Online (Sandbox Code Playgroud)


小智 5

或者这个怎​​么样?

with some_birthdays as
( 
    select date '1968-06-09' d from dual union all
    select date '1970-06-10' from dual union all
    select date '1972-06-11' from dual union all
    select date '1974-12-11' from dual union all
    select date '1976-09-17' from dual
)
select trunc(sysdate) today
, d birth_date
, floor(months_between(trunc(sysdate),d)/12) age
from some_birthdays;
Run Code Online (Sandbox Code Playgroud)