Ver Mensaje Individual
  #4 (permalink)  
Antiguo 22/07/2009, 20:43
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ¿ ¿Cómo hacer una funcion plsql para calculara la edad?

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
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 23/07/2009 a las 08:27