From: dberg@informix.com (David Berg)
Newsgroups: comp.databases.informix
Subject: Date calculation functions
Date: 30 Oct 1996 21:49:52 GMT

Following is a stored procedure that increments/decrements a date by a
specified number of months, returning the last day of the computed month
if the [in|de]cremented date is invalid. This particular procedure deals
with a DATE variable; you can tune it to deal with a DATETIME variable
and do other magical things if you wish.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

CREATE PROCEDURE incr_date(pBeg_date DATE, pIncr_mos INTEGER)
       RETURNING DATE;

-- Increment or decrement a date by a specified number of months. If the
-- computed date is beyond the last day of the month, return the last day
-- of the month.

DEFINE pComp_date  DATE;
DEFINE pAdj_days   SMALLINT;

BEGIN
      LET pAdj_days = 0;
      WHILE 1 = 1

          -- If the computed day is beyond the last day of the month,
          -- then subtract one day at a time until we find the last day
          -- of that month.

          ON EXCEPTION IN (-1267)
              LET pAdj_days = pAdj_days + 1;
          END EXCEPTION

          LET pComp_date =
              DATE (EXTEND (pBeg_date, YEAR TO DAY)
                    - pAdj_days UNITS DAY
                    + pIncr_mos UNITS MONTH);
          EXIT WHILE;
      END WHILE

      RETURN pComp_date;

END

END PROCEDURE;

--
  ___                   ___              Principal Consultant
  /  ) __      . __/    /_ ) _    _  __  Informix Software Inc. (303) 850-0210
_/__/ (_(_ (/ / (_(_  _/__) (-' ~/ '(_-  5299 DTC Blvd #740 Englewood CO 80111
dberg@informix.com                       Opinions expressed herein are my own.

Eventually all things merge into one...and a river runs through it. -N.Maclean
