Article ID: 130444 - Last Review: October 27, 2006 - Revision: 2.3

How To Calculating Years, Months, and Days Between Two Dates

System TipThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
This article was previously published under Q130444

On This Page

Expand all | Collapse all

SUMMARY

The program in this article shows by example how to calculate the combination of days, months, and years between two dates (starting date and ending date) passed as date parameters.

NOTE: The starting date must be an earlier date than the ending date.

MORE INFORMATION

To run the program, save the following code as BTWNDATE.PRG. Then issue the following command where startdate and enddate are date values:
DO BTWNDATE.PRG WITH startdate, enddate
				
For example:
DO BTWNDATE WITH {01/05/93},{01/05/95}
				

Code Sample

   *
   * BTWNDATE.PRG
   *

   PARAMETERS startdate, enddate
   IF startdate > enddate

        WAIT WINDOW "Start date must " + CHR(13) ;
        + "be earlier than End date"
        RETURN

   ENDIF
   IF PARAMETERS() <> 2

        WAIT WINDOW "Not Correct Number of Parameters"
        RETURN

   ENDIF

   PRIVATE  precmpdate, vyears, vmonths, vdays
   precmpdate={}
   vyears=0
   vmonths=0
   vdays=0
   
   * Calculate:
   *     endofmonth is the last day of month prior to month of enddate
   *
   
   endofmonth = CTOD(ALLTRIM(STR(MONTH(enddate))) + '/' + "01" + '/' + ;
   ALLTRIM(STR(YEAR(enddate)))) - 1
   *
   IF MONTH(startdate) <= MONTH(enddate)

        vyears = YEAR(enddate) - YEAR(startdate)
        IF DAY(startdate) <= DAY(enddate)
             vmonths = MONTH(enddate) - MONTH(startdate)
             vdays = DAY(enddate) - DAY(startdate)
        ELSE
             IF MONTH(startdate) = MONTH(enddate)
                  vyears = vyears - 1
             ENDIF
             vmonths = MOD(MONTH(enddate) - MONTH(startdate) - 1 + 12, 12)
             vdays = endofmonth - precmpdate + DAY(enddate)
        ENDIF

   ELSE

        vyears = YEAR(enddate) - YEAR(startdate) - 1
        IF DAY(startdate) > DAY(enddate)
             vmonths = MONTH(enddate) - MONTH(startdate) + 12 - 1
             vdays = endofmonth - precmpdate + DAY(enddate)
        ELSE
             vmonths = MONTH(enddate) - MONTH(startdate) + 12
             vdays = DAY(enddate) - DAY(startdate)
        ENDIF

   ENDIF
   CLEAR
   WAIT WINDOW  CHR(13) + ;
             '  Years: '  + STR(vyears) + CHR(13) + ;
             ' Months: ' + STR(vmonths) + CHR(13) + ;
             '   Days: ' + STR(vdays) + CHR(13) + ;
             CHR(13) + ;
             ' Between ' + DTOC(startdate) + CHR(13) +;
             '     and ' + DTOC(enddate)

   RETURN
				

APPLIES TO
  • Microsoft Visual FoxPro 3.0 Standard Edition
  • Microsoft Visual FoxPro 6.0 Professional Edition
  • Microsoft FoxPro 2.5b
  • Microsoft FoxPro 2.5a
  • Microsoft FoxPro 2.5b
  • Microsoft FoxPro 2.6 Standard Edition
  • Microsoft FoxPro 2.6a Standard Edition
  • Microsoft FoxPro 2.5b for MS-DOS
  • Microsoft FoxPro 2.5a
  • Microsoft FoxPro 2.5b for MS-DOS
  • Microsoft FoxPro 2.6 for MS-DOS
  • Microsoft FoxPro 2.6a Standard Edition
Keywords: 
kbhowto KB130444