Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

¿ ¿Cómo hacer una funcion plsql para calculara la edad?

Estas en el tema de ¿ ¿Cómo hacer una funcion plsql para calculara la edad? en el foro de Oracle en Foros del Web. Buenos dias a todos los amigos del foro,la pregunta es sencila, ¿Cómo hacer una funcion plsql en racle para calcular la edad?... Mil gracias por ...
  #1 (permalink)  
Antiguo 22/07/2009, 10:25
 
Fecha de Ingreso: febrero-2008
Ubicación: Bogotá_Colombia
Mensajes: 72
Antigüedad: 16 años, 8 meses
Puntos: 0
¿ ¿Cómo hacer una funcion plsql para calculara la edad?

Buenos dias a todos los amigos del foro,la pregunta es sencila, ¿Cómo hacer una funcion plsql en racle para calcular la edad?...


Mil gracias por adelantado a todos.
  #2 (permalink)  
Antiguo 22/07/2009, 13:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: ¿ ¿Cómo hacer una funcion plsql para calculara la edad?

Que tal diego.

Esto te puede servir:
Código sql:
Ver original
  1. CREATE OR REPLACE FUNCTION edades(fec_nac IN DATE) RETURN NUMBER
  2. AS
  3. edad NUMBER;
  4. BEGIN
  5. SELECT FLOOR(months_between(sysdate,fec_nac)/12) INTO edad FROM dual;
  6. RETURN edad;
  7. END edades;
  8. /

Estamos hablando.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 22/07/2009 a las 16:12
  #3 (permalink)  
Antiguo 22/07/2009, 17:47
 
Fecha de Ingreso: febrero-2008
Ubicación: Bogotá_Colombia
Mensajes: 72
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: ¿¿Cómo hacer una funcion plsql para calculara la edad?

Daniel gracias por tu respueta tan oportuna , lo que necesito exactamente es que me devuelva una fecha, en año mes y dia

ejemplo:

15 años , 6 meses , 3 dias
Aqui estoy n poco perdido, he mirado unos cuantos manuales con una funcion para fechas

SELECT to_char(sysdate + numtoyminterval(2, 'YEAR'), 'MM/DD/YYYY') FROM dual;

y llamao la funcion asi:

SELECT campo, NOMBRE_FUNCION to_char(sysdate + numtoyminterval(2, 'YEAR'), 'MM/DD/YYYY') FROM dual;
  #4 (permalink)  
Antiguo 22/07/2009, 20:43
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 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
  #5 (permalink)  
Antiguo 23/07/2009, 09:51
 
Fecha de Ingreso: febrero-2008
Ubicación: Bogotá_Colombia
Mensajes: 72
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: ¿ ¿Cómo hacer una funcion plsql para calculara la edad?

Daniel usted esta un duro viejo, le agradezco mucho, lo que faltaba era esta parte #

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;
#
RETURN edad;


Me va tocar leer mas para seguir sus pasos.

Mucha suerte.
  #6 (permalink)  
Antiguo 03/08/2009, 05:40
 
Fecha de Ingreso: agosto-2009
Mensajes: 2
Antigüedad: 15 años, 3 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;
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:29.