[AccessD] Age calculation function

Mark Whittinghill mwhittinghill at symphonyinfo.com
Mon Aug 4 09:23:54 CDT 2003


Gustav,

  I've been out of the office over the weekend, but I will try this one.
Thanks.

Mark Whittinghill
Symphony Information Services
612-333-1311
mwhittinghill at symphonyinfo.com
----- Original Message ----- 
From: "Gustav Brock" <gustav at cactus.dk>
To: "Access Developers discussion and problem solving"
<accessd at databaseadvisors.com>
Sent: Saturday, August 02, 2003 4:24 AM
Subject: Re: [AccessD] Age calculation function


> Hi Mark
>
> > Is there a solution to this?
>
> Certainly. It can be found here at Drew's archive:
>
>   http://www.wolfwares.com/AccessD/postinfo.asp?Post=29448
>
> However, Drew, the indenting is bad, so below is again the function we
> use.
>
> I'm not claiming this method to be the mother of anything but it works
> without errors. To quote myself from 2002-10-04:
>
> <quote>
>
> We have have had the need to calculate the correct age no matter what,
> and I have yet to see this function fail. It has been posted before but
> with so many "Age_is_just_about()" functions it seems to be the time to
> post it again.
>
> The crucial point is the correct age count for those poor souls born on
> the 29th of February:
>
>
> Function Age(ByVal datDateOfBirth As Date, Optional ByVal varDate As
Variant) As Integer
>
> ' Calculates age at today's date or at a specified date earlier or later
in time.
> ' Uses Years() for calculating difference in years.
> '
> ' Gustav Brock, Cactus Data ApS.
> ' 2000-11-03.
>
>   Dim datDate As Date
>
>   ' No special error handling.
>   On Error Resume Next
>
>   If IsDate(varDate) Then
>     datDate = CDate(varDate)
>   Else
>     datDate = Date
>   End If
>
>   Age = Years(datDateOfBirth, datDate)
>
> End Function
>
> Function Years(ByVal datDate1 As Date, ByVal datDate2 As Date) As Integer
>
> ' Returns the difference in full years between datDate1 and datDate2.
> '
> ' Calculates correctly for:
> '   negative differences
> '   leap years
> '   dates of 29. February
> '   date/time values with embedded time values
> '   negative date/time values (prior to 1899-12-29)
> '
> ' Gustav Brock, Cactus Data ApS.
> ' 2000-11-03.
> ' 2000-12-16. Leap year correction modified to be symmetrical.
> '             Calculation of intDaysDiff simplified.
> '             Renamed from YearsDiff() to Years().
> ' 2000-12-18. Added cbytMonthDaysMax.
>
>   ' Constants for leap year calculation. Last normal date of February.
>   Const cbytFebMonth      As Byte = 2
>   Const cbytFebLastDay    As Byte = 28
>   ' Maximum number of days in a month.
>   Const cbytMonthDaysMax  As Byte = 31
>
>   Dim intYears            As Integer
>   Dim intDaysDiff         As Integer
>   Dim intReversed         As Integer
>
>   ' No special error handling.
>   On Error Resume Next
>
>   intYears = DateDiff("yyyy", datDate1, datDate2)
>   If intYears = 0 Then
>     ' Both dates fall within the same year.
>   Else
>     ' Check for ultimo February and leap years.
>     If (Month(datDate1) = cbytFebMonth) And (Month(datDate2) =
cbytFebMonth) Then
>       ' Both dates fall in February.
>       ' Check if dates are at ultimo February.
>       If (Day(datDate1) >= cbytFebLastDay) And (Day(datDate2) >=
cbytFebLastDay) Then
>         ' Both dates are at ultimo February.
>         ' Check if the dates fall in leap years.
>         If Day(DateSerial(Year(datDate1), cbytFebMonth + 1, 0)) =
cbytFebLastDay Xor _
>           Day(DateSerial(Year(datDate2), cbytFebMonth + 1, 0)) =
cbytFebLastDay Then
>           ' Only one date falls within a leap year.
>           ' Adjust both dates to day 28 of February.
>           datDate1 = DateAdd("d", cbytFebLastDay - Day(datDate1),
datDate1)
>           datDate2 = DateAdd("d", cbytFebLastDay - Day(datDate2),
datDate2)
>         Else
>           ' Both dates fall either in leap years or non leap years.
>           ' No adjustment needed.
>         End If
>       End If
>     End If
>     ' Calculate day difference using months and days as Days() will fail
when
>     ' comparing leap years with non leap years for dates after February.
>     intDaysDiff = (Month(datDate1) * cbytMonthDaysMax + Day(datDate1)) -
(Month(datDate2) * cbytMonthDaysMax + Day(datDate2))
>     intReversed = Sgn(intYears)
>     ' Decrease count of years by one if dates are closer than one year.
>     intYears = intYears + (intReversed * ((intReversed * intDaysDiff) >
0))
>   End If
>
>   Years = intYears
>
> End Function
>
> </quote>
>
> /gustav
>
> _______________________________________________
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
>
>




More information about the AccessD mailing list