user763539
user763539

Reputation: 3719

Formatted time difference between two database datetime fields

I tried :

procedure TDataModule2.JournalLCalcFields(DataSet: TDataSet);
begin
JOURNAL.FieldByName('TIME').Value:= FormatDateTime('hh:mm:ss', JORNAL.FieldByName('end_date').AsDateTime - ZURNAL.FieldByName('start_date').AsDateTime);
end;

It kind of gives me the right answer at first when I run it but when I test it (change the end_date by a whole day on the sql server) then the result is totally wrong. Any clues as to why the oncalculate event fails?

TIME field is text.

Upvotes: 0

Views: 534

Answers (1)

Remy Lebeau
Remy Lebeau

Reputation: 597941

FormatDateTime() is meant for formatting a specific date/time value, not a duration between two date/time values.

You can easily write your own code to format a duration, eg:

uses
   ..., DateUtils, SysUtils;

procedure TDataModule2.JournalLCalcFields(DataSet: TDataSet);
var
  duration, hours, minutes, seconds: Int64;
begin
  duration := SecondsBetween(JORNAL.FieldByName('end_date').AsDateTime, ZURNAL.FieldByName('start_date').AsDateTime);

  hours := duration div 3600;
  duration := duration mod 3600;

  minutes := duration div 60;
  duration := duration mod 60;

  seconds := duration;

  JOURNAL.FieldByName('TIME').Value := Format('%.2d:%.2d:%.2d', [hours, minutes, seconds]);
end;

Or, you can use the RTL's TTimeSpan type to help you, eg:

uses
   ..., System.TimeSpan, SysUtils;

procedure TDataModule2.JournalLCalcFields(DataSet: TDataSet);
var
  ts: TTimeSpan;
begin
  ts := TTimeSpan.Subtract(JORNAL.FieldByName('end_date').AsDateTime, ZURNAL.FieldByName('start_date').AsDateTime);
  JOURNAL.FieldByName('TIME').Value := Format('%.2d:%.2d:%.2d', [ts.Hours, ts.Minutes, ts.Seconds]);
end;

Upvotes: 2

Related Questions