Thanks Ken Bryant
-----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Kenneth Kixmoeller/fh Sent: Tuesday, March 27, 2007 7:58 PM To: [email protected] Subject: Re: Date calculations. On Mar 27, 2007, at 6:14 PM, Bryant Minard wrote: > If I have variable (d = 397, the difference between two dates), how > can I show that in years, months and days? (example 1 year, 1 month > and 1 > day) > Has anyone written a function to do something like this? This is one I adapted that does each section. It would be easy to write a shell over it to do what you want. ************************************************************************ ******************* ************************************************************************ ******************* ** Adapted by: ** Kenneth B. Kixmoeller ** Jaguar Marketing Services, Inc. ** 35 Birchwood Lane ** Birchwood Village, Minnesota 55110-1609 USA ** Telephone 612/978-9124 ** Facsimile 651/653-7540 ** Electronic Mail [EMAIL PROTECTED] ** Web URL www.Information-Architecture.com ************************************************************************ ***************** * VB.PRG => VBJaguar.PRG * Procedure file with VB function equivalents ************************************************************************ ***************** ************************************************************************ ***************** ** Adapted from Miriam Liskin's code from FoxPro Advisor, 3/2000 by: ** * Returns the result of subtracting two date/times, expressed in any date/time increment * FUNCTION DateDiff ************************************************************************ ***************** ************************************************************************ ***************** LPARAMETERS lcInterval, ldDateTime1, ldDateTime2, lnFirstDOW, lnFirstWeek lcInterval = LOWER(lcInterval) local lnReturn,ldDateTime1bk,ldDateTime2bk && to back up the times lnReturn = .null. IF PARAMETERS() < 4 lnFirstDOW = 1 ENDIF IF INLIST(lcInterval, "h", "n", "s") * If time interval requested, convert Date to Date/Time IF VARTYPE(ldDateTime1) = "D" ldDateTime1 = DTOT(ldDateTime1) ENDIF IF VARTYPE(ldDateTime2) = "D" ldDateTime2 = DTOT(ldDateTime2) ENDIF ELSE * Otherwise, convert DateTime to Date IF VARTYPE(ldDateTime1) = "T" ldDateTime1bk = ldDateTime1 && back up the original time values for later evaluation ldDateTime1 = TTOD(ldDateTime1) ENDIF IF VARTYPE(ldDateTime2) = "T" ldDateTime2bk = ldDateTime2 && back up the original time values for later evaluation ldDateTime2 = TTOD(ldDateTime2) ENDIF ENDIF DO CASE CASE lcInterval = "yyyy" && Years lnReturn = YEAR(ldDateTime2) - YEAR(ldDateTime1) */** kbk: For my purposes, I was looking only for Whole years, therefore: if (lnReturn > 0) AND (MONTH(ldDateTime1) >= MONTH(ldDateTime2)) lnReturn = lnReturn -1 endif CASE lcInterval = "q" && Quarters IF MONTH(ldDateTime2) >= MONTH(ldDateTime1) lnMonths = (YEAR(ldDateTime2) - YEAR(ldDateTime1)) * 12 +; MONTH(ldDateTime2) - MONTH(ldDateTime1) ELSE lnMonths = (YEAR(ldDateTime2) - YEAR(ldDateTime1) - 1) * 12 +; MONTH(ldDateTime2) + 12 - MONTH(ldDateTime1) ENDIF lnReturn = INT(lnMonths / 3) CASE lcInterval = "m" && Months IF MONTH(ldDateTime2) >= MONTH(ldDateTime1) lnReturn = (YEAR(ldDateTime2) - YEAR(ldDateTime1)) * 12 +; MONTH(ldDateTime2) - MONTH(ldDateTime1) ELSE lnReturn = (YEAR(ldDateTime2) - YEAR(ldDateTime1) - 1) * 12 +; MONTH(ldDateTime2) + 12 - MONTH(ldDateTime1) ENDIF */** kbk: Ditto: For my purposes, I was looking only for Whole Months, therefore: if day(ldDateTime1) > day(ldDateTime2) lnReturn = lnReturn - 1 endif CASE INLIST(lcInterval, "y", "d") && Days lnReturn = ldDateTime2 - ldDateTime1 */** kbk:Ditto, I was looking only for Whole Days, therefore: */** when passing Times, losing the time forestalled the ability to determine whether */** it was a whole day if vartype(ldDateTime1bk) == "T" AND vartype(ldDateTime2bk) == "T" && We started with Time if hour(ldDateTime1bk) > hour(ldDateTime2bk) && the hour of the first one is bigger thatn the hour of the second (we haven't yet traversed a full day) lnReturn = lnReturn - 1 endif endif CASE lcInterval = "ww" && Weekdays lnReturn = INT((ldDateTime2 - ldDateTime1) / 7) IF DOW(ldDateTime2, lnFirstDOW) < DOW(ldDateTime1, lnFirstDOW) -1 lnReturn = lnReturn + 1 ENDIF CASE lcInterval = "w" && Weeks lnReturn = INT((ldDateTime2 - ldDateTime1) / 7) CASE lcInterval = "h" && Hour lnReturn = INT((ldDateTime2 - ldDateTime1) / 3600) CASE lcInterval = "n" && Minute lnReturn = round((ldDateTime2 - ldDateTime1) / 60,0) *lnReturn = INT((ldDateTime2 - ldDateTime1) / 60) CASE lcInterval = "s" && Second lnReturn = ldDateTime2 - ldDateTime1 ENDCASE RETURN lnReturn [excessive quoting removed by server] _______________________________________________ Post Messages to: [email protected] Subscription Maintenance: http://leafe.com/mailman/listinfo/profox OT-free version of this list: http://leafe.com/mailman/listinfo/profoxtech ** All postings, unless explicitly stated otherwise, are the opinions of the author, and do not constitute legal or medical advice. This statement is added to the messages for those lawyers who are too stupid to see the obvious.

