SQL ORACLE - Cálculo de la Edad entre dos fechas

Me gustaría conocer qué clientes se jubilarán (edad >= 65 años) entre dos fechas pasadas como parámetros donde la fecha inicial es sysdate. (La fecha de nacimiento es un campo de la tabla)

4 respuestas

Respuesta
2
select num_empleado
from empleados
where (months_between(sysdate,hiredate)/12)>=65;
Months_between es una función que te da los meses entre las dos fechas que le das como parámetros, así que por eso le dividimos para 12. Ya que no tenemos una función para saber los años entre dos fechas (al menos yo no la conozco).
Ahora bien podrías redondear o truncar ese valor antes de compararlo con 65.
Hola en primer lugar gracias por tu ayuda.
Te comento: EL problema de lo que me propones es que sólo tiene en cuenta una fecha, es decir el sysdate pero yo quiero saber qué personal se jubila entre sysdate y otra fecha mayor a sysdate pasada como parámetro.
Quiero conocer con un sql qué empleados cumplirán la edad de jubilación entre p.ejm sysdate y sysdate+30 no únicamente los que a día de hoy están jubilados que eso ya sabía hacerlo.
Gracias
select num_empleado
from empleados
where (months_between(fecha_ini,fecha_fin)/12)>=65;
Si aun no lo entiendo coméntamelo, pero fecha_ini y fecha_fin son las fechas cualesquiera, lo único que tendrías que tener en cuenta es cual es la mayor y la menor. Ambas serán parámetros. Eso ya será según la herramienta que utilices el como lo escribas.
eso como consulta, pero si lo que quieres es un prodedimiento eso ya es otra cosa.
CREATE OR REPLACE PROCEDURE nombre_pro(fecha_ini DATE,fecha_fin DATE)
IS
    CURSOR nom_cur IS
         select num_empleado
         from empleados
         where (months_between(fecha_ini,fecha_fin)/12)>=65;
BEGIN
     FOR reg IN nom_cur LOOP
         --aqui tratas la información, por ejemplo mostrarla
         dbms_output.put_line(reg.num_empleado);
     END LOOP;
END;
/
y luego a llamar al procedimiendo con los parámetros. Ya sea desde sqlplus:
EXECUTE nombre_pro('12/12/2029','23/07/2089');
o desde otro bloque pl:
begin
    nombre_pro('12/12/2029','23/07/2089');
end;
/
es o no?, o sigo sin entender xD
Hola,
no es eso.
No estás obteniendo la edad de jubilación correctamente porque no estás teniendo en cuenta la fecha de nacimiento que es un campo de la tabla.
Sería
select num_empleado
from empleados
where (months_between(sysdate,hiredate)/12)>=65;
Pero donde sysdate se va moviendo desde sysdate hasta sysdate+30 por ejemplo. Y tendría que saber con una única query (sin pl) cómo obtener eso.
Es decir son los que se jubilarán (futuro) entre hoy y el mes que viene.
Tú no me estás diciendo quien tiene 65 años me das los meses entre las dos fechas de intervalo pero eso no es la edad..
select num_empleado
from empleados
where (months_between(sysdate,b_date)/12)>=65
or (months_between(sysdate+30,b_date)/12)>=65;
:)
Respuesta

select trunc((trunc(SYSDATE) - trunc(to_date('09/10/2014','DD/MM/YYYY')))/365) as edad from dual

Con esto se calcula el numero de años que tiene la persona el TRUNC es para que no muestre los años es sencillo..

Para tu caso en especifico se puede utilizar de la siguiente manera

Select edad from (select trunc((trunc(SYSDATE) - trunc(to_date('09/10/1010','DD/MM/YYYY')))/365) as edad from dual) a
Where a.edad >=65

Respuesta

La función between_mont te mostrara la diferencia en meses entre dos fecha, esta te puede ayudar y ya esta construida en oracle desde la versión 9i especialmente para ese propósito. Además recuerda que las funciones simplifican código

Respuesta

Los que cumplen 65 en el periodo entre la fecha de la corrida o en los próximos 30 días

where add_months(fec_nac, 65 * 12) between fec_corrida and fec_corrida + 30;

Los que nacieron 65 años antes de la corrida o en los próximos 30 días

where fec_nac between add_months(fec_corrida, -65 * 12) and add_months(fec_corrida + 30, -65 * 12);

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas