Определение количества лет между двумя датами в запросе
Фрагмент запроса для определения количества лет между двумя датами для решения задачи простых процентов.
- Описание
- Подробнее
Описание
Для задачи начисления простых процентов (пени, вклады без капитализации процентов) при использовании годовой ставки необходимо вычислить дробное количество лет. Например, человек открыл вклад без капитализации процентов 01.10.2018 и решил досрочно закрыть его из-за коронавирусного кризиса 01.04.2020. Сколько всего он получил процентов по вкладу? В 2018 году это будут проценты за 92 дня или 0,252 года; в 2019 – за целый год; а в 2020 за те же 92 дня, но это будет 0,251 года, поскольку 2020 – високосный. Итого получаются проценты за 1,503 года. Количество лет нам заранее неизвестно, поэтому проще всего произвести такой расчет в цикле, перебрать каждый год, и вычислить для него долю года, для которой нужно рассчитать процент с учетом количества дней в каждом году. Например, вот так:
КоличествоЛет = 0;
НачалоИнтервала = ДатаНачалаРасчета;
КонецИнтервала = ?(Год(ДатаНачалаРасчета) = Год(ДатаОкончанияРасчета), КонецДня(ДатаОкончанияРасчета), КонецГода(ДатаНачалаРасчета));
Пока НачалоИнтервала < ДатаОкончанияРасчета Цикл
КоличествоЛет = КоличествоЛет + (КонецИнтервала - НачалоДня(НачалоИнтервала) + 1) / (КонецГода(КонецИнтервала) - НачалоГода(НачалоИнтервала) + 1);
НачалоИнтервала = КонецИнтервала + 1;
КонецИнтервала =?(Год(НачалоИнтервала) = Год(ДатаОкончанияРасчета), КонецДня(ДатаОкончанияРасчета), КонецГода(НачалоИнтервала));
КонецЦикла;
Но что если нам нужно вычислить количество лет в запросе? В языке запросов 1С нет возможности организовывать циклы. Здесь нам поможет тот факт, что дробными могут быть только два крайних года, а годы, расположенные внутри отрезка всегда окажутся целыми, сколько бы их ни было. Таким образом, задача от неопределенного числа итераций сводится к трем:
- Вычислить количество полных лет внутри интервала
- Вычислить долю первого года
- Вычислить долю последнего года
Что довольно лаконично формулируется на языке запросов:
ВЫБОР
КОГДА РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ГОД) > 1
ТОГДА РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ГОД) - 1
ИНАЧЕ 0
КОНЕЦ
+
ВЫБОР
КОГДА РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ГОД) > 0
ТОГДА (РАЗНОСТЬДАТ(ДатаНачалаРасчета, КОНЕЦПЕРИОДА(ДатаНачалаРасчета, ГОД), ДЕНЬ) + 1)
/ (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаНачалаРасчета, ГОД), КОНЕЦПЕРИОДА(ДатаНачалаРасчета, ГОД), ДЕНЬ) + 1)
+ (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаОкончанияРасчета, ГОД), ДатаОкончанияРасчета, ДЕНЬ) + 1)
/ (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаОкончанияРасчета, ГОД), КОНЕЦПЕРИОДА(ДатаОкончанияРасчета, ГОД), ДЕНЬ) + 1)
ИНАЧЕ (РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ДЕНЬ) + 1)
/ (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаНачалаРасчета, ГОД), КОНЕЦПЕРИОДА(ДатаОкончанияРасчета, ГОД), ДЕНЬ) + 1)
КОНЕЦ