Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/12/2007, 10:04
MarioHeredia
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 17 años
Puntos: 3
Resultado Desafio. Resta de Fechas, resultado en años, meses, semanas y dias.

Bueno... lo prometido es deuda y espero que este "juego" haya sido divertido,
como lo fue para mi.

Bueno.. aqui la consulta.

Código:

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
       )))))
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.

Sldo Atte, Mario.