como lo fue para mi.
Bueno.. aqui la consulta.
Código:
Ahora puedo saber la edad de mi hijo Santiago expresada en años, si hubiere años, meses, si hubiere meses, semanas, si hubiere semanas y dias, si hubiera dias.
SELECT TRUNC(SYSDATE) DIA_DE_HOY,
TO_DATE('&FECHA','DD.MM.YYYY') ENTRADA,
'&NOMBRE, '||
DECODE(ANIOS, 0,
DECODE(MESES, 0,
DECODE(SEMANAS, 0,
DECODE(DIAS, 0, 'acaba de nacer.', 'tiene '||DIAS||DECODE(DIAS, 1, ' dia', ' dias')||' de vida. '),
'tiene '||SEMANAS||DECODE(SEMANAS, 1, ' semana', ' semanas')||DECODE(DIAS, 0, ' de vida.', ' y '||DIAS||DECODE(DIAS, 1, ' dia', ' dias')||' de vida. ')
), 'tiene '||MESES||DECODE(MESES, 1, ' mes', ' meses')||
DECODE(SEMANAS, 0, DECODE(DIAS, 0, ' de vida.', ' y '||DIAS||DECODE(DIAS, 1, ' dia', ' dias')||' de vida. '),
DECODE(DIAS, 0, ' y ', ', ')||SEMANAS||DECODE(SEMANAS, 1, ' semana', ' semanas')||DECODE(DIAS, 0, 'de vida.', ' y '||DIAS||DECODE(DIAS, 1, ' dia', ' dias')||' de vida. '))),
'tiene '||ANIOS||DECODE(ANIOS, 1, ' anio', ' anios')||
DECODE(MESES, 0,
DECODE(SEMANAS, 0,
DECODE(DIAS, 0, ' de vida.', ' y '||DIAS||DECODE(DIAS, 1, ' dia', ' dias')||' de vida. '),
DECODE(DIAS, 0, ' y ', ', ')||SEMANAS||DECODE(SEMANAS, 1, ' semana', ' semanas')||DECODE(DIAS, 0, 'de vida.', ' y '||DIAS||DECODE(DIAS, 1, ' dia', ' dias')||' de vida. ')
), DECODE(DIAS + SEMANAS, 0, ' y ', ', ')||MESES||DECODE(MESES, 1, ' mes', ' meses')||
DECODE(SEMANAS, 0, DECODE(DIAS, 0, ' de vida.', ' y '||DIAS||DECODE(DIAS, 1, ' dia', ' dias')||' de vida. '),
DECODE(DIAS, 0, ' y ', ', ')||SEMANAS||DECODE(SEMANAS, 1, ' semana', ' semanas')||DECODE(DIAS, 0, ' de vida.', ' y '||DIAS||DECODE(DIAS, 1, ' dia', ' dias')||' de vida. ')))) EDAD
FROM (
SELECT ANIOS,
MESES,
NVL(FLOOR(DIAS / 7), 0) SEMANAS,
NVL(MOD(DIAS, 7), 0) DIAS
FROM (
SELECT CASE WHEN MESES >= 12 THEN FLOOR(MESES / 12)
ELSE 0 END ANIOS,
CASE WHEN MESES >= 12 THEN MOD(MESES , 12)
ELSE MESES END MESES,
CASE WHEN DIA > DIA_ACTUAL THEN DIA - 1 ELSE DIA END DIAS
FROM (
SELECT NVL(MESES, 0) MESES,
DECODE(RESTO, 0, 0,
0.03, 01, 0.06, 02, 0.09, 03, 0.12, 04, 0.16, 05, 0.19, 06, 0.22, 07, 0.25, 08, 0.29, 09, 0.32, 10,
0.35, 11, 0.38, 12, 0.41, 13, 0.45, 14, 0.48, 15, 0.51, 16, 0.54, 17, 0.58, 18, 0.61, 19, 0.64, 20,
0.67, 21, 0.70, 22, 0.74, 23, 0.77, 24, 0.80, 25, 0.83, 26, 0.87, 27, 0.90, 28, 0.93, 29, 0.96, 30
) DIA,
DIA_ACTUAL
FROM (
SELECT DECODE(DIFERENCIA, 0, 0, DECODE(INSTR( DIFERENCIA, '.'), 0, DIFERENCIA, TO_NUMBER(SUBSTR( DIFERENCIA, 1, INSTR( DIFERENCIA, '.') -1)))) MESES,
DECODE(DIFERENCIA, 0, 0, DECODE(INSTR( DIFERENCIA, '.'), 0, 0, SUBSTR( DIFERENCIA, INSTR( DIFERENCIA, '.'), 3))) RESTO,
DIA_ACTUAL
FROM (
SELECT NVL(MONTHS_BETWEEN(TO_CHAR(TRUNC(SYSDATE), 'DD-MON-YYYY'),
TO_CHAR(TO_DATE('&FECHA','DD.MM.YYYY'), 'DD-MON-YYYY')), 0) DIFERENCIA,
TO_CHAR(TRUNC(SYSDATE), 'DD') DIA_ACTUAL
FROM DUAL
)))))
Sldo Atte, Mario.

