Calcular la diferencia de años entre dos fechas Oracle SQL

Hola a todos, hoy os voy a explicar como podemos calcular la diferencia de años entre dos fechas en Oracle.

Algo habitual en nuestras base de datos es almacenar fechas y es posible que necesitemos calcular una diferencia de años, por ejemplo, la fecha de nacimiento de una persona o la antigüedad de un empleado en una empresa.

Partiendo de esta base de datos:

CREATE TABLE PERSONA (
    NOMBRE VARCHAR2(20) PRIMARY KEY,
    FECHA_NAC DATE 
);

INSERT INTO PERSONA VALUES('FERNANDO', TO_DATE('05/02/1990', 'DD/MM/YYYY'));
INSERT INTO PERSONA VALUES('MANUEL', TO_DATE('03/11/1992', 'DD/MM/YYYY'));
INSERT INTO PERSONA VALUES('ALBERTO', TO_DATE('21/01/2001', 'DD/MM/YYYY'));
INSERT INTO PERSONA VALUES('ALFREDO', TO_DATE('15/12/1981', 'DD/MM/YYYY'));
INSERT INTO PERSONA VALUES('JESUS', TO_DATE('17/04/2005', 'DD/MM/YYYY'));
INSERT INTO PERSONA VALUES('EDUARDO', TO_DATE('27/10/1960', 'DD/MM/YYYY'));

Para calcular los años entre la fecha de hoy y la fecha de nacimiento de la persona, usaremos la función month_between para calcular los meses entre dos fechas y después lo dividimos entre 12.

Como el resultado puede devolver un decimal, usaremos la función floor para redondear a la baja, por ejemplo, si el valor es 31,89 con floor es 31.

SELECT floor(months_between(SYSDATE, FECHA_NAC) /12) as edad FROM persona;

Este seria el resultado:

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

1 comentario

  1. Linda Franco

    Hola, buenas tardes! Me gustaría saber qué se le podría agregar a ese query para calcular también los meses y días que tiene. No estoy segura de si lo siguiente sería correcto. Gracias!
    floor(months_between(SYSDATE, FECHA_NAC)/12) años,
    floor(mod(months_between(SYSDATE, FECHA_NAC),12)) meses,
    floor(mod(months_between(SYSDATE, FECHA_NAC),7)) días // Aquí no me convence el 7 porque siento que sería más bien 30 por los días del mes, pero cómo saber si es un día de 30 o 31, o si se trata de febrero?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *