Topic: разница между двумя датами количество лет месяцев дней
Добрый вечер
Появилась необходимость посчитать разницу между двумя датами (стаж работы) по типу сколько лет, месяцев, дней
Есть таблица: dates
Колонки: data1 data2
в колонку data1 - записывается начальная дата (к примеру 01.04.2020)
в колонку data2 - записывается конечная дата (к примеру 16.04.2020)
Результат = 0 лет 0 месяцев 16 дней
сами функции подсчета правописания дней, месяцев, лет
// Вывод строки дней
function StrDays(iDay: integer): string;
begin
Result:= ' дней ';
case iDay of
1, 21, 31: Result:= ' день ';
2, 3, 4, 22, 23, 24: Result:= ' дня ';
end;
end;
// Вывод строки месяцев
function StrMonths(iMonth: integer): string;
begin
Result:= ' месяцев ';
case iMonth of
1: Result:= ' месяц ';
2, 3, 4: Result:= ' месяца ';
end;
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 StrBetweenDate(Date1, Date2: TDate): string;
var
id, im, iy: Integer;
d: TDate;
begin
Result:= '';
if Date1 < Date2 then
begin
d:= Date1;
Date1:= Date2;
Date2:= d;
Date1:= Date1 + 1;
end;
d:= DaysBetween(Date1 + 1, Date2);
id:= DayOf(d);
im:= MonthOf(d)-1;
iy:= YearOf(d);
iy:= iy - 1900;
if im = 12 then
begin
im:= 0;
inc(iy);
end;
if id = 31 then
begin
id:= 0;
inc(im);
if im = 12 then
begin
im:= 0;
inc(iy);
end;
end;
Result:= (IntToStr(iy)+ StrYears(iy) + IntToStr(im) +
StrMonths(im) + IntToStr(id)+ StrDays(id));
end;
Использование
procedure Form1_Button3_OnClick(Sender: string);
var
dt1, dt2: TDateTime;
begin
dt1:=SQLExecute('SELECT StrToDate(data1) FROM dates WHERE id='+Form1.TableGrid1.sqlValue);
dt2:=SQLExecute('SELECT StrToDate(data2) FROM dates WHERE id='+Form1.TableGrid1.sqlValue);
ShowMessage(StrBetweenDate(dt1, dt2));
end;
по разному уже пробовал использовать данные с таблицы (и уже просто даты вписывал в dt1 и dt2, все время ошибка
List index out of bounds (1)
Что делаю не так, можете подсказать или направить?