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

时间:2010-06-10 14:39:28

标签: oracle datetime

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

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

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

15 个答案:

答案 0 :(得分:40)

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>

答案 1 :(得分:13)

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

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

       AGE
----------
9.48924731

答案 2 :(得分:8)

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

这很简单直截了当。

答案 3 :(得分:2)

另一种不使用任何算术和数字的替代方案(尽管没有任何问题):

SQL> with some_birthdays as
  2  ( select date '1968-06-09' d from dual union all
  3    select date '1970-06-10' from dual union all
  4    select date '1972-06-11' from dual union all
  5    select date '1974-12-11' from dual union all
  6    select date '1976-09-17' from dual
  7  )
  8  select trunc(sysdate) today
  9       , d birth_date
 10       , extract(year from numtoyminterval(months_between(trunc(sysdate),d),'month')) age
 11    from some_birthdays
 12  /

TODAY               BIRTH_DATE                 AGE
------------------- ------------------- ----------
10-06-2010 00:00:00 09-06-1968 00:00:00         42
10-06-2010 00:00:00 10-06-1970 00:00:00         40
10-06-2010 00:00:00 11-06-1972 00:00:00         37
10-06-2010 00:00:00 11-12-1974 00:00:00         35
10-06-2010 00:00:00 17-09-1976 00:00:00         33

5 rows selected.

答案 4 :(得分:2)

或者这个怎​​么样?

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;

答案 5 :(得分:2)

这似乎比其他任何人建议的要容易得多

select sysdate-to_date('30-jul-1977') from dual; 

答案 6 :(得分:1)

人的年龄(全年):

SELECT
  TRUNC(months_between(sysdate, per.DATE_OF_BIRTH) / 12) AS "Age"
FROM PD_PERSONS per

答案 7 :(得分:0)

SQL>select to_char(to_date('19-11-2017','dd-mm-yyyy'),'yyyy') -  to_char(to_date('10-07-1986','dd-mm-yyyy'),'yyyy') year,
to_char(to_date('19-11-2017','dd-mm-yyyy'),'mm') -  to_char(to_date('10-07-1986','dd-mm-yyyy'),'mm') month,
to_char(to_date('19-11-2017','dd-mm-yyyy'),'dd') -  to_char(to_date('10-07-1986','dd-mm-yyyy'),'dd') day from dual;

      YEAR      MONTH        DAY
---------- ---------- ----------
        31          4          9

答案 8 :(得分:0)

您可以尝试

@media print {

.myReport tfoot>tr>td {
  border: none !important;
}

.myReport tfoot {
  border: 1px solid #ddd !important;
}
}

您可以配置<table> <tbody> <tr> <td rowspan="200">Group Header</td> <td>BBB</td> <td>BBB</td> </tr> <tr> <!-- 199 more times --> <td>BBB</td> <td>CCC</td> </tr> </tbody> <tfoot> <tr class="table-footer"> <td colspan="3">AAAAA AAAAAAA AAAAAAA AAAAA AAAAAAA AAAAAAA</td> </tr> </tfoot> </table>以显示任意位数。

将日期像上述那样以十进制格式显示,有助于计算年龄段等。

这只是一个人为的例子。在现实世界中,您不会使用SELECT ROUND((SYSDATE - TO_DATE('12-MAY-16'))/365.25, 5) AS AGE from DUAL; 将字符串转换为日期。

但是,如果您使用日期格式的出生日期,则可以安全地减去两个日期。

答案 9 :(得分:0)

假设您想知道在June 4, 1996出生的某人的年龄(仅年数,一个固定数字),请执行以下命令:

SELECT TRUNC(TO_NUMBER(SYSDATE - TO_DATE('04-06-1996')) / 365.25) AS AGE FROM DUAL;

结果:(2019年5月28日执行)

       AGE
----------
        22

说明:

  • SYSDATE:获取系统(OS)的实际日期。
  • TO_DATE('04-06-1996'):将VARCHAR(字符串)出生日期转换为DATE(SQL类型)。
  • TO_NUMBER(...):将日期转换为NUMBER(SQL类型)
  • 365.25划分:每四年拥有bissextile year(每天增加4 * 0.25 = 1天)。
  • Trunc(...):仅从数字中检索整个部分。

答案 10 :(得分:0)

您可以尝试以下方法,

SELECT EXTRACT(YEAR FROM APP_SUBMITTED_DATE)-EXTRACT(YEAR FROM BIRTH_DATE) FROM SOME_TABLE;

它将比较年数并相应给出年龄。
您也可以使用SYSDATE代替APP_SUBMITTED_DATE

致谢。

答案 11 :(得分:0)

从设计中选择 trunc(to_number(sysdate - to_date(dob) /365.25)) 作为年龄

年龄

26 25 31

答案 12 :(得分:0)

    SELECT FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE, 'DD'), dob)/12)
    FROM dual;

答案 13 :(得分:-1)

select (extract(year from current_date)-extract(year from Date_of_birth)) as Age from table_name;`

age=current_year - birth_year;

extract(日期的年/月/日)//从日期中提取值的oracle函数

答案 14 :(得分:-4)

选择(SYSDATE-DOB)/ 365&#34;年龄&#34;来自双重