Jump to content
View in the app

A better way to browse. Learn more.

FMForums.com

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Calculating Age in Years, Months, Weeks, Days

Featured Replies

  • Newbies

I have the following FMP7 calculation that displays an age as "xx Years, xx Months, xx Days". It works fine.

GetAsText ((Year (Get(CurrentDate)) - Year (DOB) - If (Get(CurrentDate) < Date (Month (DOB); Day (DOB); Year (Get(CurrentDate))); 1; 0)) & " Years, " &

GetAsText (Mod (Month (Get(CurrentDate)) - Month(DOB) + 12 - If (Day (Get(CurrentDate)) < Day (DOB); 1; 0); 12)) & " Months, " &

GetAsText (Day (Get(CurrentDate)) - Day (DOB) + If (Day (Get(CurrentDate)) >= Day (DOB); 0; If (Day (Get(CurrentDate) - Day (Get(CurrentDate))) < Day (DOB); Day (DOB); Day (Get(CurrentDate) - Day (Get(CurrentDate))))))) & " Days"

I'm hung up (as always) on weeks and would like the calculation to calculate and display as follows: "xx Years, xx Months, xx WEEKS, xx Days" where whole years, months, weeks are shown and any remaining days. I've fooled around with the date functions WeekOfYear and WeekOfYearFiscal without success (yet).

This is my first post. Be gentle. Your advice is most appreciated.

Version: v7.x

Platform: Mac OS X Panther

X days = Int( X / 7 ) weeks and Mod( X, 7 ) days, so

GetAsText ((Year (Get(CurrentDate)) - Year (dob) - Case (Get(CurrentDate) < Date (Month (dob); Day (dob); Year (Get(CurrentDate))); 1; 0)) & " Years, " &

GetAsText (Mod (Month (Get(CurrentDate)) - Month(dob) + 12 - Case (Day (Get(CurrentDate)) < Day (dob); 1; 0); 12)) & " Months, " &

Let( days = GetAsText (Day (Get(CurrentDate)) - Day (dob) + Case (Day (Get(CurrentDate)) >= Day (dob); 0; Case (Day (Get(CurrentDate) - Day (Get(CurrentDate))) < Day (dob); Day (dob); Day (Get(CurrentDate) - Day (Get(CurrentDate)))))); Int( days / 7 ) & " Weeks, " & Mod( days; 7 ))) & " Days"

I used the Let function here so that I wouldn't have to duplicate the final hairy calculation, and instead defined it as 'days' to make it less complicated and more apparent.

  • Author
  • Newbies

Thanks so much! I noticed CASE statements replaced IF too. I still have to remember CASE is more "economical" than IF. LET is cool.

Now...to handle results of 1 so it'll display "1 Year" instead of "1 Years", etc.

Thanks again.

Let(years = GetAsText ((Year (Get(CurrentDate)) - Year (dob) - (Get(CurrentDate) < Date (Month (dob); Day (dob); Year (Get(CurrentDate)))))); years & " Year" & Right("s, "; (years = 1)*-1 + 3)) &

Let(months = GetAsText (Mod (Month (Get(CurrentDate)) - Month(dob) + 12 - (Day (Get(CurrentDate)) < Day (dob)); 12)); months & " Month" & Right("s, "; months = 1)*-1 + 3)) &

Let(days = GetAsText (Day (Get(CurrentDate)) - Day (dob) + Case (Day (Get(CurrentDate)) >= Day (dob); 0; Case (Day (Get(CurrentDate) - Day (Get(CurrentDate))) < Day (dob); Day (dob); Day (Get(CurrentDate) - Day (Get(CurrentDate)))))); Int(days/7) & " Week" & Right("s, "; (Int(days/7) = 1)*-1 + 3) & Mod(days; 7) & " Day" & Left("s"; Mod(days; 7) <> 1))

I tweaked the original calc a little to remove redundant Case( ) statements and moved the ending parens to the end of the 'Years' portion, then used Let( ) again and some Right( ) functions with semi-boolean results to determine whether ", " or "s, " should be used.

  • Author
  • Newbies

Wow, thanks again!

I started fooling around with your earlier calc and had done LETS for years and months too. I was using CASE statements to handle the plurals though. Your new one's more elegant.

The last tweak is to make the display entirely dynamic, i.e., if any Years, Months, Weeks, or Days = 0 then display only those >= 1, e.g., 1 Year, 2 Weeks, 3 Days OR 1 Day OR 2 Years, 1 Week. Entering today's date, the field sh/be blank.

As a self-professed "calculation fiend", you're a great help. Looking over your code really helps me better understand all the functions (when I'm not thrashing on balancing parentheses...sigh). If I'm pressing my luck, just say so.

Thanks again.

I think you may have overlooked a problem with the day calculation since all months are not created equal. As long as both dates are 28 or less you should have no problem.

Do some really careful checking of your results.

Someplace I have a set of calculations for older versions.

Create an account or sign in to comment

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.