Topic: Преобразование даты

Здравствуйте, уважаемые разработчики!

Пытаюсь сделать программу для кадровиков. По задумке программа должна уметь рассчитать стаж на текущую дату и заданную вручную дату. Вторая функция - напоминание о наступлении нового стажевого периода. Проблема в том, что кадровики работают с датами в формате Год, Месяц, День. То есть происходит сложение двух дат и преобразование в цифры. Например Иванов И.И. проработал учителем ИЗО 5 лет, 6 месяцев, 7 дней. В Excel такое делается функцией РАЗНДАТ. Но нет напоминаний.

Скажите, возможно ли в MyVisualDatabase реализовать следующие вещи:

1) Сложение нескольких дат в формате дд.мм.гггг и преобразование в вид ХХ лет, ХХ месяцев, ХХ дней?
2) При достижении определенной даты в стаже учителя (счетчик приближается к определенной цифре) - например если наступило 10 лет стажа - при запуске программы появляется окно с предупреждением об этом?

Re: Преобразование даты

Приветствую.


1. Не совсем понял относительно сложения дат, складываются даты или стаж?
В базе данных как я понимаю храняться только периоды дат, в которых человек работал?


Получить разницу между датами в годах, месяцах и днях можно так

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
    TD1,TD2:TDateTime;
    M,Y,D:Integer;
    Year, Month, Day, Year2, Month2, Day2: Word;
begin
    TD1:=Trunc(Form1.DateTimePicker1.Date);
    TD2:=Trunc(Form1.DateTimePicker2.Date);
    Decodedate(TD1,Year, Month, Day );
    Decodedate(TD2,Year2, Month2, Day2 );
    Y:=Year2-Year;
    M:=Month2-Month;

    if Month2<Month then
    begin
        dec(Y);
        M:=(Month2+12)-Month
    end else M:=Month2-Month;

    if Day2<Day then begin dec(M);
    D:=(Day2+30)-Day end else D:=Day2-Day;

    ShowMessage( IntToStr(Y)+' лет '+IntToStr(M)+' месяцев '+ IntToStr(D)+' дней' );
end;


2. Можно, но сначало нужно разобраться с первым вопросом.

Dmitry.

3 (edited by tsib 2019-12-10 05:31:35)

Re: Преобразование даты

1. Не совсем понял относительно сложения дат, складываются даты или стаж?

Складывают даты. Например есть сотрудник который отработал два периода:
с 01.01.2010 по 02.02.2012
и
с 03.03.2013 по 04.04.2014

Производим арифметические действия. Из большей даты вычитаем меньшую:
02.02.2012                        04.04.2014
-                                           -
01.01.2010                        03.03.2013
=                                          =
01.01.02                             01.01.01

Получившиеся результаты складываем:

01.01.02
+
01.01.01
=
02.02.03

Получаем, что человек проработал 3 года, 2 месяца, 2 дня


В базе данных как я понимаю храняться только периоды дат, в которых человек работал?

Да. И на основе введенных дат производятся вычисления. Отсюда еще вопрос.  В таблице БД под каждое поле на форме потребуется сделать отдельную строку (приложил изображение к сообщению)?

Post's attachments

Attachment icon person.jpg 78.07 kb, 93 downloads since 2019-12-10