Расчет Oracle Age с даты рождения и сегодня

Вопрос:Я хочу рассчитать текущий возраст от даты рождения в моей функции 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

Вопрос:

Я хочу рассчитать текущий возраст от даты рождения в моей функции 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> Ответ №1

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

select months_between(TRUNC(sysdate), to_date(’15-Dec-2000′,’DD-MON-YYYY’) )/12 as age from dual; AGE ———- 9.48924731 Ответ №2SELECT TRUNC((SYSDATE — TO_DATE(DOB, ‘YYYY-MM-DD’))/ 365.25) AS AGE_TODAY FROM DUAL;

Это легко и прямолинейно.

Ответ №3

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

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

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

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

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

select sysdate-to_date(’30-jul-1977′) from dual; Ответ №6

Возраст (полные годы) Лица:

SELECT TRUNC(months_between(sysdate, per.DATE_OF_BIRTH) / 12) AS «Age» FROM PD_PERSONS per Ответ №7SQL>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

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

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

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

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

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

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

Ответ №9

Предположим, что вы хотите, чтобы возраст (только число лет, фиксированное число) человека, родившегося в 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(…): извлечь всю часть только из номера.

Ответ №10

Вы можете попробовать метод ниже,

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

Он будет сравнивать годы и соответственно определять возраст.
Вы также можете использовать SYSDATE вместо APP_SUBMITTED_DATE.

С уважением.

Ответ №11

выберите (SYSDATE-DOB)/365 “Возраст” из двойного

Оцените статью
Добавить комментарий