Informix – Add month or year to date

Hola a tod@s,

Os dejo una función que he creado para evitar el error «The result of a datetime computation is out of range» que nos puede aparecer al intentar hacer una SQL en informix al tratar de sumar o restar meses o años a una fecha.

CREATE FUNCTION Add_datetime_interval
(dFecha    DATE,
 iIntervalo  int,
 bMeses  BOOLEAN,
 bRestar boolean) returning DATE as fecha

   DEFINE dResult  DATE;       
   DEFINE iDay           INT;        
   DEFINE iMonth         INT;         

  LET iDay = DAY(dFecha);
  LET dResult = dFecha – (iDay – 1) UNITS DAY;
  LET iMonth = MOD(MONTH(dFecha) + iIntervalo, 12) ; 

  IF NOT bMeses THEN
    IF NOT bRestar THEN
      LET dResult = dResult + iIntervalo UNITS YEAR; 
    ELSE
      LET dResult = dResult – iIntervalo UNITS YEAR;
    END IF
    LET iMonth = MONTH(dResult + (iDay – 1) UNITS DAY);        
  ELSE
    IF NOT bRestar THEN
      LET dResult = dResult + iIntervalo UNITS MONTH;      
    ELSE
      LET dResult = dResult – iIntervalo UNITS MONTH;
    END IF
    LET iMonth = MONTH(dResult + (iDay – 1) UNITS DAY);
  END IF 

  IF iMonth <> MONTH(dResult) THEN
    LET dResult = dResult + (iDay – 1) UNITS DAY;
    LET iDay = DAY(dResult);
    LET dResult = dResult – iDay UNITS DAY;
  ELSE
    LET dResult = dResult + (iDay – 1) UNITS DAY;
  END IF 

  RETURN dResult;

END FUNCTION;

Espero que os ayude como a mi me ha servido.

Saludos.