Topic: счет всех столбцов таблицы с датами

вообщем то затея такая.. посчитать два столбца даты в таблице и в идеале красиво вывести информацию в edit.
1. Есть таблица Poslu, в таблице два поля (типа Дата) PosluDate, PosluDateEnd
в поле PosluDate всегда заносится начальная дата (пример: 01.07.2021)
в поле PosluDateEnd всегда заносится конечная дата (пример: 04.07.2021)
даты могут быть с перерывами (пример: 1)11.01.2021-11.02.2021 2)11.04.2021-11.05.2021)
и так далее... строк может быть много с периодами дат, последняя строка поле PosluDateEnd может быть пустым, в таком случае этой строке и этому полю задается текущая дата.
2. Посчитать все периоды дат и просчитать либо просто общее количество дней и потом разбивать на года, месяца, дни.. либо каждую строку разбивать на года, месяца, дни и потом складывать с другими строками.
Я думаю как это лучше сделать, возможно ли в массив загнать и посчитать, а может как то иначе... пока не могу сообразить
Может кто помочь?

На данный момент реализовано по одной нажатой в таблице строке просчет периода и вывода в года, месяца, дни в edit (все прекрасно работает)

procedure frmClient_gridPoslu_OnCellClick (Sender:  TObject; ACol, ARow: Integer; Action: string);
var
years, months, days: integer;
    monthsTotal: integer;
    minDate: TDateTime;
    i, c: integer;
    DD, MM, YY: word;
    date1, date2:  TDateTime;
begin

frmClient.gridPoslu.BeginUpdate;
frmClient.Edit4.Clear;
    if frmClient.gridPoslu.Cells[0, frmClient.gridPoslu.SelectedRow] = '' then date1:= (strtodate(DateToStr(Now))) else date1:= (strtodate(frmClient.gridPoslu.Cells[0, frmClient.gridPoslu.SelectedRow]));
    if frmClient.gridPoslu.Cells[1, frmClient.gridPoslu.SelectedRow] = '' then date2:= (strtodate(DateToStr(Now))) else date2:= (strtodate(frmClient.gridPoslu.Cells[1, frmClient.gridPoslu.SelectedRow]));

   date1 := trunc(date1);
   date2 := trunc(date2);


    years := YearsBetween(date1, date2);
    monthsTotal := MonthsBetween(date1, date2);
    months := monthsTotal - (years * 12);

    if date1 > date2 then minDate := date2 else minDate := date1;

    date1 := IncMonth(minDate, monthsTotal);
    days := DaysBetween(date1, date2);

    frmClient.Edit4.Text := 'выводим период ' +IntToStr(years)+ StrYears(years)+ IntToStr(months)+ StrMonths(months)+ IntToStr(days)+ StrDays(days);

  frmClient.gridPoslu.EndUpdate;
end;

функция вывода года

function StrYears(iYear: integer): string;
var
  s: string;
  sYear: string;
  i: integer;
begin
  result := ' лет ';
  if (iYear > 4) and (iYear < 21) then exit;
  sYear := IntToStr(iYear);
  s := Copy(sYear, Length(sYear), 1);
  i := StrToInt(s);
  case i of
    1: result := ' год ';
    2, 3, 4: result := ' года ';
  end;
end;

функция вывода месяца

function StrMonths(iMonth: integer): string;
begin
  Result:= ' месяцев ';
  case iMonth of
    1: Result:= ' месяц ';
    2, 3, 4: Result:= ' месяца ';
  end;
end;

функция вывода дней

function StrDays(iDay: integer): string;
begin
  Result:= ' дней ';
  case iDay of
    1, 21, 31: Result:= ' день ';
    2, 3, 4, 22, 23, 24: Result:= ' дня ';
  end;
end;