Расчет возраста Oracle от даты рождения и сегодня - PullRequest
18 голосов
/ 10 июня 2010

Я хочу вычислить текущий возраст с даты рождения в моей функции Oracle.

Я использую (Today-Dob)/30/12, но это не совсем верно, поскольку в некоторых месяцах есть 31 день.

Мне нужно получить правильный возраст с максимальной точностью.Как я могу это сделать?

Ответы [ 11 ]

40 голосов
/ 10 июня 2010
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>
13 голосов
/ 11 июня 2010

Для бизнес-логики я обычно нахожу десятичное число (в годах):

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

       AGE
----------
9.48924731
9 голосов
/ 09 марта 2017
SELECT 
TRUNC((SYSDATE - TO_DATE(DOB, 'YYYY-MM-DD'))/ 365.25) AS AGE_TODAY FROM DUAL;

Это просто и понятно.

2 голосов
/ 21 мая 2013

Это кажется гораздо проще, чем кто-либо другой предложил

select sysdate-to_date('30-jul-1977') from dual; 
2 голосов
/ 11 января 2013

Или как насчет этого?

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;
2 голосов
/ 10 июня 2010

И альтернатива без использования арифметики и чисел (хотя в этом нет ничего плохого):

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.
1 голос
/ 29 августа 2017

Возраст (полные годы) человека:

SELECT
  TRUNC(months_between(sysdate, per.DATE_OF_BIRTH) / 12) AS "Age"
FROM PD_PERSONS per
0 голосов
/ 28 мая 2019

Предположим, что вы хотите, чтобы возраст (только количество лет, фиксированное число) человека, родившегося в June 4, 1996, выполнил эту команду:

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

Результат: (Выполнено 28 мая 2019 г.)

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

Объяснение:

  • SYSDATE: получение фактической даты системы (ОС).
  • TO_DATE('04-06-1996'): преобразовать дату рождения VARCHAR (строка) в DATE (тип SQL).
  • TO_NUMBER(...): преобразование даты в NUMBER (тип SQL)
  • Делить на 365.25: иметь биссекстильный год каждые четыре года (4 * 0,25 = еще 1 день).
  • Trunc(...): получить всю часть только с номера.
0 голосов
/ 16 мая 2019

Вы можете попробовать

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

Вы можете настроить ROUND, чтобы показывать столько десятичных разрядов, сколько вы хотите.

Размещение даты в десятичном формате, как указано выше, помогает при расчете возрастагруппы и т. д.

Это просто надуманный пример.В реальных сценариях вы не будете конвертировать строки в дату, используя TO_DATE.

Однако, если у вас есть дата рождения в формате даты, вы можете безопасно вычесть две даты.

0 голосов
/ 20 ноября 2017
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...