Contributor: MITCHELL PEEK unit SCDates; { VANITY PART This Unit was originally created by Simon Carter (sc4vb@geocities.com) To return the difference of two dates by various methods. This code is provided as freeware with no warranty implied or expressed. If you change anything with this unit then please inform me via E-mail with relevant fixes If you use this unit in your application then please put my name and E-mail in credits. Thanks to the following people for their input via Delphi-l or Delphi-talk Mitchell R. Peek Gentleman Jersey Dan Mustafa Bicak Robert Penz Released to Public Domain on 22 May 1997 Release history 22/05/97 Simon Carter Created } interface uses Sysutils; Type EInvalidPeriod = Class(Exception); {DateDiff Purpose of this function is to calculate the difference between two dates and return various types of information.} Function DateDiff(Period: Word; Date2, Date1: TDatetime):Longint; implementation Function DateDiff(Period: Word; Date2, Date1: TDatetime):Longint; Var Year, Month, Day, Hour, Min, Sec, MSec: Word; //These are for Date 1 Year1, Month1, Day1, Hour1, Min1, Sec1, MSec1: Word; //these are for Date 2 Begin //Decode Dates Before Starting //This is probably ineficient but it will save doing it for each //different Period. DecodeDate(Date1, Year, Month, Day); DecodeDate(Date2, Year1, Month1, Day1); DecodeTime(Date1, Hour, Min, Sec, MSec); DecodeTime(Date2, Hour1, Min1, Sec1, MSec1); //Default Return will be 0 Result := 0; //Once Decoded Select Type of DateDiff To Return via Period Parameter Case Period of 1: //Seconds Begin //first work out days then * days by 86400 (mins in day) //Then minus the difference in hours * 3600 //then minus the difference in minutes * 60 //Then get the difference in seconds Result := (((((Trunc(Date1) - Trunc(Date2))* 86400) - ((Hour1 - Hour)* 3600))) - ((Min1 - Min) * 60)) - (Sec1 - Sec); end; 2: //Minutes Begin //first work out days then * days by 1440 (mins in day) //Then minus the difference in hours * 60 //then minus the difference in minutes Result := (((Trunc(Date1) - Trunc(Date2))* 1440) - ((Hour1 - Hour)* 60)) - (Min1 - Min); End; 3: //hours Begin //First work out in days then * days by 24 to get hours //then clculate diff in Hours1 and Hours Result := ((Trunc(Date1) - Trunc(Date2))* 24) - (Hour1 - Hour); End; 4: //Days Begin //Trunc the two dates and return the difference Result := Trunc(Date1) - Trunc(Date2); End; 5: //Weeks Begin //Trunc the two dates and divide //result by seven for weeks Result := (Trunc(Date1) - Trunc(Date2)) div 7; end; 6: //Months Begin //Take Diff in Years and * 12 then add diff in months Result := ((Year - Year1) * 12) + (Month - Month1); End; 7: //Years Begin //Take Difference In Years and Return result Result := Year - Year1; End Else //Invalid Period *** Raise Exception *** Begin Raise EInvalidPeriod.Create('Invalid Period Assigned To DateDiff'); Result := 0; end; End; End; end.