Определение количества лет между двумя датами в запросе

29.10.20

Разработка - Запросы

Фрагмент запроса для определения количества лет между двумя датами для решения задачи простых процентов.

Для задачи начисления простых процентов (пени, вклады без капитализации процентов) при использовании годовой ставки необходимо вычислить дробное количество лет. Например, человек открыл вклад без капитализации процентов 01.10.2018 и решил досрочно закрыть его из-за коронавирусного кризиса 01.04.2020. Сколько всего он получил процентов по вкладу? В 2018 году это будут проценты за 92 дня или 0,252 года; в 2019 – за целый год; а в 2020 за те же 92 дня, но это будет 0,251 года, поскольку 2020 – високосный. Итого получаются проценты за 1,503 года. Количество лет нам заранее неизвестно, поэтому проще всего произвести такой расчет в цикле, перебрать каждый год, и вычислить для него долю года, для которой нужно рассчитать процент с учетом количества дней в каждом году. Например, вот так:

КоличествоЛет = 0;
НачалоИнтервала = ДатаНачалаРасчета;
КонецИнтервала = ?(Год(ДатаНачалаРасчета) = Год(ДатаОкончанияРасчета), КонецДня(ДатаОкончанияРасчета), КонецГода(ДатаНачалаРасчета));

Пока НачалоИнтервала < ДатаОкончанияРасчета Цикл
	КоличествоЛет = КоличествоЛет + (КонецИнтервала - НачалоДня(НачалоИнтервала) + 1) / (КонецГода(КонецИнтервала) - НачалоГода(НачалоИнтервала) + 1);
	НачалоИнтервала = КонецИнтервала + 1;
	КонецИнтервала =?(Год(НачалоИнтервала) = Год(ДатаОкончанияРасчета), КонецДня(ДатаОкончанияРасчета), КонецГода(НачалоИнтервала));
КонецЦикла;

Но что если нам нужно вычислить количество лет в запросе? В языке запросов 1С нет возможности организовывать циклы. Здесь нам поможет тот факт, что дробными могут быть только два крайних года, а годы, расположенные внутри отрезка всегда окажутся целыми, сколько бы их ни было. Таким образом, задача от неопределенного числа итераций сводится к трем:

  1. Вычислить количество полных лет внутри интервала
  2. Вычислить долю первого года
  3. Вычислить долю последнего года                                     

Что довольно лаконично формулируется на языке запросов:

ВЫБОР
	КОГДА РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ГОД) > 1
		ТОГДА РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ГОД) - 1
	ИНАЧЕ 0
КОНЕЦ
+ 
ВЫБОР
	КОГДА РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ГОД) > 0
		ТОГДА (РАЗНОСТЬДАТ(ДатаНачалаРасчета, КОНЕЦПЕРИОДА(ДатаНачалаРасчета, ГОД), ДЕНЬ) + 1)
				 / (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаНачалаРасчета, ГОД), КОНЕЦПЕРИОДА(ДатаНачалаРасчета, ГОД), ДЕНЬ) + 1)
		 	+ (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаОкончанияРасчета, ГОД), ДатаОкончанияРасчета, ДЕНЬ) + 1)
		 		 / (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаОкончанияРасчета, ГОД), КОНЕЦПЕРИОДА(ДатаОкончанияРасчета, ГОД), ДЕНЬ) + 1)
	ИНАЧЕ (РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ДЕНЬ) + 1)
			 / (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаНачалаРасчета, ГОД), КОНЕЦПЕРИОДА(ДатаОкончанияРасчета, ГОД), ДЕНЬ) + 1)
КОНЕЦ

 

СКД запрос пени простые проценты

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    178575    988    403    

947

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    1835    14    XilDen    26    

35

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    12495    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    7522    XilDen    36    

91

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10171    user1840182    5    

29

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    3028    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    12128    implecs    6    

49
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 99 02.11.20 15:49 Сейчас в теме
Параметры запроса в 1с задаются амперсандом.
2. antonivan 178 02.11.20 15:54 Сейчас в теме
(1) В этом фрагменте нет параметров. ДатаНачалаРасчета и ДатаОкончанияРасчета - это поля таблицы, содержащей даты, для которых мы рассчитываем количество лет.
3. triviumfan 99 02.11.20 17:18 Сейчас в теме
(2) ИмяТаблицы.ДатаНачалаРасчета
4. antonivan 178 02.11.20 17:41 Сейчас в теме
(3) Если нужно, можно подставить ИмяТаблицы, в случае одной таблицы, работает и просто по имени поля. Для простоты примера не стал загромождать запрос
5. FatPanzer 02.11.20 17:46 Сейчас в теме
(4) Для простоты примера как раз таки надо было написать имя таблицы, чтобы понимать источник данных...
Оставьте свое сообщение