两个数据库日期时间字段之间的格式化时间差

Formatted time difference between two database datetime fields

我试过了:

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;

一开始我 运行 它给出了正确的答案,但是当我测试它时(在 sql 服务器上将 end_date 更改一整天)然后结果是完全错误的。 关于原因的任何线索 oncalculate 事件失败?

TIME 字段是文本。

FormatDateTime() 用于格式化特定的 date/time 值,而不是两个 date/time 值之间的持续时间。

您可以轻松编写自己的代码来格式化持续时间,例如:

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;

或者,您可以使用 RTL 的 TTimeSpan 类型来帮助您,例如:

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;