Ver Mensaje Individual
  #6 (permalink)  
Antiguo 03/08/2009, 05:40
trompicones
 
Fecha de Ingreso: agosto-2009
Mensajes: 2
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: ¿ ¿Cómo hacer una funcion plsql para calculara la edad?

Cita:
Iniciado por huesos52 Ver Mensaje
Diego
Mire esta:

Código sql:
Ver original
  1. CREATE OR REPLACE FUNCTION edades(fec_nac IN DATE) RETURN VARCHAR2
  2. AS
  3. edad_anos NUMBER;
  4. edad_meses NUMBER;
  5. edad_dias NUMBER;
  6. edad varchar2(40);
  7. BEGIN
  8. SELECT FLOOR(months_between(sysdate, fec_nac)/12) INTO edad_anos FROM dual;
  9. SELECT FLOOR(MOD(months_between(sysdate, fec_nac),12)) INTO edad_meses FROM dual;
  10. SELECT FLOOR(
  11.          (MOD(months_between(sysdate, fec_nac),12)
  12.           - FLOOR(MOD(months_between(sysdate, fec_nac),12)))*30
  13.             ) INTO edad_dias
  14. FROM dual;
  15. SELECT (CAST(edad_anos AS varchar2(10))||' anos '||CAST(edad_meses AS varchar2(10))||' Meses '||CAST(edad_dias AS varchar2(10))||' Dias ') INTO edad FROM dual;
  16. RETURN edad;
  17. END edades;

Para llamarla debe ser
Código sql:
Ver original
  1. SELECT edades(to_date('1984-11-12','YYYY-MM-DD')) FROM dual;
  2. EDAD                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
  3. ---------------------------------
  4. 24 anos 8 Meses 10 Dias
  5.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
  6. 1 ROWS selected


Donde el parámetro de entrada es la fecha de nacimiento.
Devuelve los años,meses y días que tiene la persona.

El uso de numtoyminterval, corresponde a convertir un numero para ser mostrado en formato año-mes, pero no sería posible mostrar también los días.
El uso correcto de numtoyminterval es

Código sql:
Ver original
  1. SELECT numtoyminterval(months_between(sysdate,to_date('1984-11-12','YYYY-MM-DD')),'month') fecha FROM dual;
  2. FECHA                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  3. ------------------------
  4. +0000000024-08                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
  5.  
  6. 1 ROWS selected

Donde se establece la conversión de un numero indicado en meses, para ser mostrado en formato año-mes.
Sin embargo, es mas elegante la primera función.

Espero le sirva viejo
Hola, tenemos la muy mala costrumbre de hacer select from dual para cosas que no se necesitan.

el codigo mucho mas purificado y rapido seria:

CREATE OR REPLACE FUNCTION edades(fec_nac IN date) RETURN VARCHAR2
AS
edad_anos number;
edad_meses number;
edad_dias number;
edad varchar2(40);
BEGIN
edad_anos:=floor(months_between(sysdate, fec_nac)/12);
edad_meses:=floor(mod(months_between(sysdate, fec_nac),12));
edad_dias:=floor(
(mod(months_between(sysdate, fec_nac),12)
- floor(mod(months_between(sysdate, fec_nac),12)))*30
) ;
return (cast(edad_anos as varchar2(10))||' anos '||cast(edad_meses as varchar2(10))||' Meses '||cast(edad_dias as varchar2(10))||' Dias ');
end edades;