禁用密码锁

ADBlock阻止了网站上的某些内容

ADBlock errore

从出生和今天的日期甲骨文年龄计算

StackOverflow https://stackoverflow.com/questions/3015431

我要计算在我的Oracle功能从出生日期目前的年龄。

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

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

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>

其他提示

有关的业务逻辑我通常找到的十进制数(年)是有用的:

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

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

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

这是简单和直接的地步。

和,而无需使用任何算术和数字(尽管没有错)的替代:

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.

或者这个怎​​么样?

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;

这似乎比别人怎么曾建议要容易得多

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

人身的

年龄(全年):

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

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

您可以尝试

SELECT ROUND((SYSDATE - TO_DATE('12-MAY-16'))/365.25, 5) AS AGE from DUAL;

您可以配置ROUND如你希望显示尽可能多的小数位。

在像前述的十进制格式放置日期年龄组等的计算有帮助。

这仅仅是一个人为的例子。在现实世界中的场景,你不会使用TO_DATE字符串转换日期。

不过,如果你有出生日期的日期格式,你可以放心地减去两个日期。

假设你想有(年只,固定数量的数字)出生于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型)
  • Devide每365.25:为了有一个闰年每四年(4 * 0.25 = 1更多天)。
  • Trunc(...):只从多个检索整个部分

可以尝试以下方法,

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

这会比较年,并给予相应的年龄。结果 您还可以使用SYSDATE代替APP_SUBMITTED_DATE

问候。

选择(SYSDATE-DOB)/ 365 “年龄” 从双

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow