Cita:
Iniciado por huesos52 Diego
Mire esta:
Código sql:
Ver originalCREATE OR REPLACE FUNCTION edades(fec_nac IN DATE) RETURN VARCHAR2
AS
edad_anos NUMBER;
edad_meses NUMBER;
edad_dias NUMBER;
edad varchar2(40);
BEGIN
SELECT FLOOR(months_between(sysdate, fec_nac)/12) INTO edad_anos FROM dual;
SELECT FLOOR(MOD(months_between(sysdate, fec_nac),12)) INTO edad_meses FROM dual;
SELECT FLOOR(
(MOD(months_between(sysdate, fec_nac),12)
- FLOOR(MOD(months_between(sysdate, fec_nac),12)))*30
) INTO edad_dias
FROM dual;
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;
END edades;
Para llamarla debe ser
Código sql:
Ver originalSELECT edades(to_date('1984-11-12','YYYY-MM-DD')) FROM dual;
EDAD
---------------------------------
24 anos 8 Meses 10 Dias
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 originalSELECT numtoyminterval(months_between(sysdate,to_date('1984-11-12','YYYY-MM-DD')),'month') fecha FROM dual;
FECHA
------------------------
+0000000024-08
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;