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

Adicionar un mes exacto a una fecha

Estas en el tema de Adicionar un mes exacto a una fecha en el foro de Oracle en Foros del Web. Hola a todos Tengo un inconveniente, necesito calcular la fecha exactamente un mes despues de la que recibe mi funcion por parametro, pero tengo rollo ...
  #1 (permalink)  
Antiguo 01/02/2011, 13:17
 
Fecha de Ingreso: febrero-2011
Mensajes: 9
Antigüedad: 13 años, 9 meses
Puntos: 1
Pregunta Adicionar un mes exacto a una fecha

Hola a todos

Tengo un inconveniente, necesito calcular la fecha exactamente un mes despues de la que recibe mi funcion por parametro, pero tengo rollo con febreo y los meses de 30 dias

Este es mi query.

SELECT ADD_MONTHS ('28/02/2010',1) FROM DUAL. La salida que necesito es 28/03/2011, pero me arroja 31/03/2011.

Tambien intente esto: SELECT ADD_months (to_date('28/02/2010','dd/mm/yy')-1,1)+1 FROM DUAL y funcionó para este caso pero con el parametro 31/03/2010 el resultado es 01/05/2010.

Independiente siempre me debe sumar un mes, para el caso de los meses como 31/01/2011 en ese caso si la salida debe ser el ultimo dia de febrero 28/02/2011.

Gracias

Última edición por SONOFGOD; 01/02/2011 a las 17:19 Razón: grá
  #2 (permalink)  
Antiguo 02/02/2011, 05:24
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: Adicionar un mes exacto a una fecha

Con tantas condiciones, te resulta mejor crear una función y valerte de conficionales IF y toda la potencia de PL para tener una respuesta bien hecha.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 02/02/2011, 07:29
 
Fecha de Ingreso: febrero-2011
Mensajes: 9
Antigüedad: 13 años, 9 meses
Puntos: 1
De acuerdo Respuesta: Adicionar un mes exacto a una fecha

Gracias huesos52

La verdad pensé que podia existir un comando o que habia que hacerle algo adicional al ADD_MONTHS que para este caso no funciona como se espera ADD_MONTHS ('28/02/2010',1)='28/03/2010'.
Nuevamente gracias. Tendré que hacer un bloque formateando las fechas y controlando la excepción.
  #4 (permalink)  
Antiguo 16/02/2011, 13:35
 
Fecha de Ingreso: febrero-2011
Mensajes: 9
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: Adicionar un mes exacto a una fecha

Cita:
Iniciado por huesos52 Ver Mensaje
Con tantas condiciones, te resulta mejor crear una función y valerte de conficionales IF y toda la potencia de PL para tener una respuesta bien hecha.

saludos
Que tal... un pregunta para solucionar este incoveniente cree una pequeña funcion pero necesito tomar la excepcion "ORA-01830: date format picture ends before converting entire input string" que corresponde a la arrojada cuando intento formatear mi fecha asi:
Recibe por parametro fechaCobro='29/01/2010'

F_Sig_Corte DATE;

F_Corte:= TO_CHAR(TO_DATE(fechaCobro,'DD/MM/RRRR'),'DD')||'/'||TO_CHAR(ADD_MONTHS(TO_DATE(fechaCobro,'DD/MM/RRRR'), 1),'MM/RRRR');

Hay alguna variable directa de la excepcion para este caso no se si conoces de algo similar a como funciona "WHEN NO_DATA_FOUND THEN" o "TOO_MANY_ROWS" etc
  #5 (permalink)  
Antiguo 17/02/2011, 08:26
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: Adicionar un mes exacto a una fecha

mira este link
http://ss64.com/oraplsql/exception.html

las variables SQLCODE y SQLERRM donde podrías controlarlos cuando haces un WHEN OTHERS THEN.

SALUDOS
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 17/02/2011, 10:36
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Adicionar un mes exacto a una fecha

Hola SONOFGOD:

No sé si ya resolviste tu problema, pero al leer que estás tratando de tomar excepciones y cuestiones por el estilo creo que te estás complicando la vida. Si aun no das con la función para agregar el mes prueba con esta, creo que funciona, recibe como parámetro una fecha y regresa la fecha con el mes agregado, con los casos especiales que mencionas.

Código:
CREATE OR REPLACE
FUNCTION F_AGREGA_MES (FECHA DATE)
RETURN DATE AS
BEGIN
  IF (EXTRACT(MONTH FROM FECHA) = 2) THEN
      --Para validar el mes de febrero
      IF (EXTRACT(DAY FROM FECHA) < 28) THEN
        RETURN ADD_MONTHS(FECHA, 1);
      ELSE 
        IF (EXTRACT(DAY FROM FECHA) = 28) THEN
          IF (EXTRACT(DAY FROM LAST_DAY(FECHA)) = 28) THEN
            RETURN FECHA + 28;
          ELSE
            RETURN FECHA + 29;
          END IF;
        ELSE
          RETURN FECHA + 29;   
        END IF;
      END IF;
  ELSE
    IF (EXTRACT(MONTH FROM FECHA) IN (4, 6, 9, 11)) THEN
      --para validar los días que tienen 30 dias
      IF (EXTRACT(DAY FROM FECHA) = 30) THEN 
        RETURN FECHA + 30;
      ELSE
        RETURN ADD_MONTHS(FECHA, 1);
      END IF;        
    ELSE
      --Se agrega un mes sin problemas
      RETURN ADD_MONTHS(FECHA, 1);
    END IF;
  END IF;    
  RETURN NULL;
END F_AGREGA_MES;
Si tú tienes otra solución a tu problema sería bueno que compartieras con el foro qué fue lo que hiciste, por si le puede servir a alguien más.

Saludos
Leo.
  #7 (permalink)  
Antiguo 17/02/2011, 13:17
 
Fecha de Ingreso: febrero-2011
Mensajes: 9
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: Adicionar un mes exacto a una fecha

Gracias por la ayuda de todos

Finalmente hice esta funcion que recibe la fecha y devuelve la fecha un mes despues o antes segun el parámetro Meses si es positivo o negativo respectivametne, asi aplica para todos los meses sin importar si son de 28,29,30 o 31 días...

Código:
FUNCTION FN_ADICIONA_MES (F_Entrada DATE, Mes NUMBER)
  RETURN DATE AS
-- Recibe la fecha y la cantidad de meses que desea adicionar o restar
  F_Salida DATE NULL;
  DiaEntrada NUMBER(2);
  UltimoDia NUMBER(2);

BEGIN
	
  DiaEntrada := TO_NUMBER(TO_CHAR(F_Entrada,'DD'));
  UltimoDia := TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(F_Entrada,Mes)),'DD'));
		
  IF DiaEntrada > UltimoDia THEN
    F_Salida := LAST_DAY ( ADD_MONTHS(F_Entrada,Mes) );
  ELSE
    F_Salida:= TO_CHAR(F_Entrada,'DD')||'/'||TO_CHAR(ADD_MONTHS(F_Entrada, Mes),'MM/RRRR');
  END IF;
  RETURN F_Salida;
END FN_ADICIONA_MES; 

Última edición por SONOFGOD; 17/02/2011 a las 14:36 Razón: Optimizacion de Código

Etiquetas: add_months, date
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 16:12.