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.