Oracle PL / SQL, Cómo calcular la edad a partir de la date de nacimiento utilizando una variable de sustitución simple y months_between

Estoy trabajando en un simple bloque PL / SQL que le pregunta al usuario su date de nacimiento y calcula su edad. He utilizado los meses_entrelos divididos por 12 conversiones, pero estoy teniendo problemas con la conversión de date y la input de date del usuario para la variable de sustitución. Por favor, ignore el v_birthday_year ya que esa es otra parte del código que debo integrar más adelante.

No estoy seguro del formatting que el usuario debe escribir, es decir, 05-07-1980 o 06 Mar 1978, que sería aceptable, y cómo calcular su edad a partir de lo que pusieron.

Mi progtwig deseado es escribir un progtwig PL / SQL para aceptar la date de nacimiento del usuario en este formatting DD-MON-YYYY, y calcula la edad en 1 lugar decimal. Así que lo necesito calculado con un decimal también.

Esto es lo que tengo, pero no estoy seguro de qué formatting escribir en la date de nacimiento en la input de la variable de sustitución y el cálculo real con un lugar decimal. Solo estoy tratando de ver dónde me estoy equivocando y cómo corregirlo.

SET SERVEROUTPUT ON DECLARE --v_birthday_year NUMBER(4) := &v_birthday_year; v_dob DATE := &v_dob v_your_age NUMBER(3, 1); BEGIN v_your_age := TRUNC(MONTHS_BETWEEN(SYSDATE, v_dob))/12; DBMS_OUTPUT.PUT_LINE ('Your age is ' || v_your_age); END; / 

Todos los ejemplos SQL de otros y de mí probablemente sean mejores para usar a less que esté aprendiendo algo sobre PL / SQL. Esto es lo que se me ocurrió:

  DECLARE v_dob DATE:= to_date('&v_dob', 'MM/DD/YYYY'); -- copy this line and you'll be fine v_your_age NUMBER(3, 1); BEGIN v_your_age := TRUNC(MONTHS_BETWEEN(SYSDATE, v_dob))/12; DBMS_OUTPUT.PUT_LINE ('Your age is ' || v_your_age); END; / I passed 01/01/2010. Got this in output: Your age is 3.1 

Otro ejemplo de SQL:

 SELECT empno, ename, hinetworkingate , TRUNC(MONTHS_BETWEEN(sysdate, hinetworkingate)/12) years_of_service FROM scott.emp / 

Puede usar cualquiera de estos (sql puro)

 SELECT months_between(sysdate, user_birth_date) /12 FROM dual; 

o

 SELECT floor(months_between(sysdate, user_birth_date) /12) FROM dual; 

o

 SELECT EXTRACT(YEAR FROM sysdate) - EXTRACT(YEAR FROM user_birth_date) FROM dual 

o

 SELECT (sysdate - user_birth_date) / 365.242199 FROM dual 

Espero que esto ayude

  Create or replace function getAge(birthday date) return number is v_your_age NUMBER(3, 1);`` BEGIN v_your_age := floor(MONTHS_BETWEEN(SYSDATE, birthday))/12; return v_your_age; END; / 

entonces llamas a la function

 BEGIN DBMS_OUTPUT.PUT_LINE ('Your age is ' || getAge(to_date('10/10/2015','DD/MM/YYYY'))); end; / 
 select dob,sysdate,trunc(months_between(sysdate,dob)/12) as year, trunc(mod(months_between(sysdate,dob),12)) as month, trunc(sysdate - add_months(dob,((trunc(months_between(sysdate,dob)/12)*12) + trunc(mod(months_between(sysdate,dob),12))))) as day from emp;