I use another method, which is not very elegant, but it seems to work every
time!

SET V VBDAY DATE
SET V VBDAY = (use any method you like to get the birthday, ie lookup, fillin,
etc)
SET V VDATE DATE
SET V VDATE = .#DATE
SET V VAGE REAL
SET V VYEAR1 = (IYR(.VBDAY))
SET V VYEAR2 = (IYR(.VDATE))
SET V VAGE = (.VYEAR2 - .VYEAR1)
SET V VMON1 = (IMON(.VBDAY))
SET V VMON2 = (IMON(.VDATE))
SET V VDAY1 = (IDAY(.VBDAY))
SET V VDAY2 = (IDAY(.VDATE))
IF VMON2  > .VMON1 OR (.VMON2 = .VMON1 AND .VDAY2 >= .VDAY1) THEN
  -- DO NOTHING
ELSE
  SET V VAGE = (.VAGE - 1)
ENDIF
SET V VAGE = ((.VDATE - .VBDAY)/365.25)
CLEAR VAR VYEAR1 VYEAR2 VMON1 VMON2 VDAY1 VDAY2
RETURN

Humbly submitted,
Mike Sinclair

David Blocker wrote:

> Mike
>
> Thanks for sharing this neat SP!
>
> David Blocker
>
> ----- Original Message -----
> From: "MikeB" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Thursday, March 21, 2002 1:53 PM
> Subject: Age Calculation
>
> > In Dec., an accountant wanted to refer to the age of his client.  To
> > accurately show the age of anyone on a given date, the precise
> determination
> > of leap year comes into play.  A Stored proc was created of the following:
> >
> > Procedure    : sp_age
> > Description  :
> > ID           : 3
> > Last Modified: December 13, 2001   6:17 PM
> > Version      : 1
> >
> >   Parameter Name       Parameter Attributes
> >   -------------------- ---------------------------------------------------
> --
> > ----
> >   vdatein              Type       : DATE
> >
> >   Procedure has 1 parameters.
> >   Return Value:        Type       : INTEGER
> >
> > The Code of the Procedure is this:
> >
> > --Begin Code:
> > *(spAge mod 121301 mbyerley)
> > *(returns int years)
> >   CLEAR VAR MICRORIM_RETURN,stp_return,vage,vagedays,vageyr, +
> >   vlp,vthisdays,vthisyr,vyr
> >   SET VAR vdatein DATE
> >   SET VAR vage INTEGER = NULL
> >   IF vdatein IS NULL THEN
> >     SET VAR vage = 0
> >   ELSE
> >     SET VAR vthisyr INTEGER = (INT((SGET((CTXT((JDATE(.#DATE)))),4,1))))
> >     SET VAR vthisdays INTEGER  =
> (INT((SGET((CTXT((JDATE(.#DATE)))),3,5))))
> >     SET VAR vageyr INTEGER = (INT((SGET((CTXT((JDATE(.vdatein)))),4,1))))
> >     SET VAR vagedays INTEGER  =
> (INT((SGET((CTXT((JDATE(.vdatein)))),3,5))))
> >     -- check for leap year
> >     SET VAR vyr = (IYR(.vdatein))
> >     SET VAR vlp INTEGER = NULL
> >     IF ((MOD(.vyr,4)) = 0 AND (MOD(.vyr,100)) <> 0) +
> >     OR (MOD(.vyr,400)) = 0 THEN
> >       -- True
> >       SET VAR vlp = 1
> >     ELSE
> >       -- False
> >       SET VAR vlp = 0
> >     ENDIF
> >     SET VAR vagedays = (.vagedays - .vlp)
> >     -- dayofyear is < birthday age is year minus birthyear minus 1
> >     IF vthisdays < .vagedays  THEN
> >       SET VAR vage = ((.vthisyr - 1) - .vageyr)
> >       -- dayofyear is after or on birthday age is year minus birthyear
> >     ELSE
> >       --dayofyear is on birthday or after age is year minus birthyear
> >       SET VAR vage = (.vthisyr - .vageyr)
> >     ENDIF
> >   ENDIF
> >   CLEAR VAR vagedays,vageyr,vdatein,vlp,vthisdays,vthisyr,vyr
> >   RETURN .vage
> >
> > --End Code:
> >
> >
> > It is called by the following:
> > The Var vDateIN is set as a Date DataType to the Birthdate
> >
> > Set Var vDateIN date = 04/17/1944
> >
> > Then:
> >
> > Set Var vAge = (call Sp_Age(.vDateIn))
> >
> > Var vAge is returned properly.....
> >
> >
> >
> > ================================================
> > TO SEE MESSAGE POSTING GUIDELINES:
> > Send a plain text email to [EMAIL PROTECTED]
> > In the message body, put just two words: INTRO rbase-l
> > ================================================
> > TO UNSUBSCRIBE: send a plain text email to [EMAIL PROTECTED]
> > In the message body, put just two words: UNSUBSCRIBE rbase-l
> > ================================================
> > TO SEARCH ARCHIVES:
> > http://www.mail-archive.com/rbase-l%40sonetmail.com/
>
> ================================================
> TO SEE MESSAGE POSTING GUIDELINES:
> Send a plain text email to [EMAIL PROTECTED]
> In the message body, put just two words: INTRO rbase-l
> ================================================
> TO UNSUBSCRIBE: send a plain text email to [EMAIL PROTECTED]
> In the message body, put just two words: UNSUBSCRIBE rbase-l
> ================================================
> TO SEARCH ARCHIVES:
> http://www.mail-archive.com/rbase-l%40sonetmail.com/

================================================
TO SEE MESSAGE POSTING GUIDELINES:
Send a plain text email to [EMAIL PROTECTED]
In the message body, put just two words: INTRO rbase-l
================================================
TO UNSUBSCRIBE: send a plain text email to [EMAIL PROTECTED]
In the message body, put just two words: UNSUBSCRIBE rbase-l
================================================
TO SEARCH ARCHIVES:
http://www.mail-archive.com/rbase-l%40sonetmail.com/

Reply via email to