题
我想要计算的目前年龄从出生日期在我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;
结果是:(执行月28日2019年)
AGE
----------
22
说明:
SYSDATE
:得到系统(OS)实际日期。TO_DATE('04-06-1996')
:转换VARCHAR
(string)出生日期到DATE
(SQL type)。TO_NUMBER(...)
:转换的日期NUMBER
(SQL type)- 两部分每
365.25
:有一个 bissextile年 每四年(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 “年龄” 从双
不隶属于 StackOverflow