Topic: Вычислительное поле период дат

Здравствуйте Уважаемые форумчане
не удается решить проблему с вычислительным полем, а может даже лучше это сделать в скрипте
суть такова, есть две таблицы client, contracts
client - в этой таблице основные данные о заказчике (является родителем contracts)
contracts - находятся данные данные о заказчике типо какой контракт, с какого времени, по какое время

в самой таблице client сделал вычислительное поле для вычисления последней записи с таблицы contracts, а именно окончание контракта и все прекрасно работает

(SELECT IFNULL(strftime('%d.%m.%Y', ContractsDateEnd),"укажите дату") FROM Contracts WHERE Client.id=Contracts.id_Client ORDER BY Contracts.ContractsDateEnd DESC)

появилась нужда в выделение строк тех клиентов у кого подходит конец контракта по договору, а именно за период 12 месяцев, 6 месяцев, 4 месяца, 1 месяц, в текущем году, в текущем месяце... не могу сообразить как это правильно реализовать... сначала пошел методом вычислительного поля

CASE
    WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+2 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+3 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+4 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+5 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+6 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+7 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+8 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+9 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+10 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+11 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+12 month') = strftime('%m', DateName) THEN 12    
    WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+2 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+3 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+4 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+5 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+6 month') = strftime('%m', DateName) THEN 6
    WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+2 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+3 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+4 month') = strftime('%m', DateName) THEN 4
    WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) THEN 1
    WHEN strftime('%YYYY', 'now') = strftime('%YYYY', DateName) THEN 0
    WHEN strftime('%m', 'now') = strftime('%m', DateName) THEN 2
    ELSE NULL
END 

ничего не вышло, даже добавлял в этом вычислительное поле разные условия (типо FROM Contracts WHERE Client.id=Contracts.id_Client ORDER BY Contracts.ContractsDateEnd DESC))... но мог где-то ошибиться

Далее пробовал скриптом

procedure Form1_gridClient_OnChange (Sender: string);
var
   i, c, q, r, d, a, year, Month12, Month6, Month4, Month1, nowMonth: integer;
   iToday, iTomorrow: integer;
   sCell: string;
   sCellContr: string;
   DD, MM, MMMM, YY, YYNow: word;
   dtBirth: TDateTime;
   nextMonth: TDateTime;
   vi: integer;
   Contr: TDateTime;

begin
Form1.gridClient.BeginUpdate;

    r := 0;
    q := 0;
    d := 0;
    a := 0;
    year := 0;
    Month12 := 0;
    Month6 := 0;
    Month4 := 0;
    Month1 := 0;
    nowMonth := 0;

  c := Form1.gridClient.RowCount - 1;
    for i := 0 to c do
    begin

        sCellContr := Form1.gridClient.Cells[16,i];
        if ValidDate(sCellContr) then
        begin
            DecodeDate(Now, YYNow, MM, DD);
            DecodeDate(StrToDate(sCellContr), YY, MM, DD);;
            Contr := EncodeDate(YY, MM, DD);
            Contr := Trunc(Contr);

            if (Trunc(Now) - Contr) <= 25 then
            begin
                Form1.gridClient.Cell[16,i].Color := clSilver;
                Inc(year);
            end;            
         end;

        end;
    end;

    Form1.Button5.Caption:= '12 месяцев (' +IntToStr(Month12)+ ')';
    Form1.Button6.Caption:= '6 месяцев (' +IntToStr(Month6)+ ')';
    Form1.Button7.Caption:= '4 месяца (' +IntToStr(Month4)+ ')';
    Form1.Button10.Caption:= '1 месяц (' +IntToStr(Month1)+ ')';
    Form1.Button8.Caption:= 'в текущем году (' +IntToStr(year)+ ')';
    Form1.Button11.Caption:= 'в ' +MonthName(Date())+ ' (' +IntToStr(nowMonth)+ ')';

     Form1.gridClient.EndUpdate;
end;      

В итоге скрипт закрашивает столбец, но не учитывает год. Тоесть я указал <=25 он сравнивает только дни...

Кто может навести в правильное русло как сделать сравнение с сегодняшней датой с датой в столбец и закрасить эту строку, при условии что этот сравниваемый столбец должен быть либо в течение 12 месяцев, либо 6 месяцев, либо 4 месяцев, либо 1 месяца, либо в текущем году, либо в текущем месяце.

Например: 29.06.2021 -  текущая дата;  в столбце дата=29.12.2021 (тоесть эта дата попадает под 12 месяцев, под 6 месяцев и под текущий год);

Прошу Вашей помощи в правильности составления кода, бьюсь три дня, результатом никак не доволен...

Re: Вычислительное поле период дат

Кажется что то у меня получилось в вычислительном поле, не правильно формировал запрос…
Надо было соединить два запроса что я выше писал и получаем вот так

(SELECT
CASE
    WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+2 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+3 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+4 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+5 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+6 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+7 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+8 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+9 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+10 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+11 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+12 month') = strftime('%m', DateName) THEN 12    
    WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+2 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+3 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+4 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+5 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+6 month') = strftime('%m', DateName) THEN 6
    WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+2 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+3 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+4 month') = strftime('%m', DateName) THEN 4
    WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) THEN 1
    WHEN strftime('%YYYY', 'now') = strftime('%YYYY', DateName) THEN 0
    WHEN strftime('%m', 'now') = strftime('%m', DateName) THEN 2
    ELSE NULL
END AS dateofcontracts 
 FROM Contracts WHERE Client.id=Contracts.id_Client ORDER BY Contracts.ContractsDateEnd DESC)

Щас буду тестить полностью

Re: Вычислительное поле период дат

Необходимо заменить все записи где есть %m на %m.%YYYY
Но теперь есть беда, есть окончание в текущем году, он берет всех под одну гребенку кроме следующего месяца