Аналоги функций ДобавитьКДате и РазностьДат языка запросов

tormozit 44 2 3
//.
// Возвращаемое значение:
//   Структура - значения положительны для месячных типов и отрицательны для секундных
Функция МножителиТиповПериодов() Экспорт
	Сутки = 24*60*60;
	Множители = Новый Структура("Год, Полугодие, Квартал, Месяц,    Декада,   Неделя,     День,    Час, Минута, Секунда",
			                     12,          6,       3,     1, -10*Сутки, -7*Сутки, -1*Сутки, -60*60,    -60,      -1);
	Возврат Множители;
КонецФункции 

// Аналог функции ДобавитьКДате языка запросов.
// Параметры:
//   ИсходнаяДата - Дата - 
//   ТипПериода - Строка - имя типа периода аналогично языку запросов, регистр букв не важен
//   Количество - Число - допускается отрицательное
// Возвращаемое значение:
//   Дата - 
Функция ДобавитьКДате(Знач ИсходнаяДата, Знач ТипПериода, Знач Количество = -1) Экспорт
	ТипПериода = ВРег(ТипПериода);
	Если Найти("ГОД;КВАРТАЛ;ПОЛУГОДИЕ;МЕСЯЦ;", ТипПериода + ";") > 0 Тогда
		Если Цел(Количество) <> Количество Тогда
			ВызватьИсключение "Количество должно быть целым числом для типа периода " + ТипПериода;
		КонецЕсли;
	КонецЕсли;
	Множители = МножителиТиповПериодов();
	Если Не Множители.Свойство(ТипПериода) Тогда
		ВызватьИсключение "Неподдерживаемый тип периода: " + ТипПериода;
	КонецЕсли;
	Если Множители[ТипПериода] > 0 Тогда
		Возврат ДобавитьМесяц(ИсходнаяДата, Количество * Множители[ТипПериода]);
	Иначе
		Возврат ИсходнаяДата - Количество * Множители[ТипПериода];
	КонецЕсли;
КонецФункции 

// Аналог функции РазностьДат языка запросов.
// Параметры:
//   ВычитаемаяДата - Дата - которую вычитаем
//   ИсходнаяДата - Дата - из которой вычитаем
//   ТипПериода - Строка - имя типа периода аналогично языку запросов, регистр букв не важен
// Возвращаемое значение:
//   Число - ИсходнаяДата-ВычитаемаяДата
Функция РазностьДат(Знач ВычитаемаяДата, Знач ИсходнаяДата, Знач ТипПериода) Экспорт
	Множители = МножителиТиповПериодов();
	Если Не Множители.Свойство(ТипПериода) Тогда
		ВызватьИсключение "Неподдерживаемый тип периода: " + ТипПериода;
	КонецЕсли;
	Если Множители[ТипПериода] > 0 Тогда
		Возврат Цел((Год(ИсходнаяДата)   * 12 + Месяц(ИсходнаяДата)   - 1) / Множители[ТипПериода])
			  - Цел((Год(ВычитаемаяДата) * 12 + Месяц(ВычитаемаяДата) - 1) / Множители[ТипПериода])
	Иначе
		Возврат Цел((Дата(1,1,1) - ИсходнаяДата)   / Множители[ТипПериода])
			  - Цел((Дата(1,1,1) - ВычитаемаяДата) / Множители[ТипПериода])
	КонецЕсли;
КонецФункции
2

Комментарии

tormozit
#1, ред. 03 июня 2025 08:30

Сделано на основе https://fastcode.im/Templates/6833/dobavit-k-date-i-raznost-dat


rvfinik
#2, 04 июня 2025 11:26

(1) tormozit, спасибо, очень не хватало этих функций


См. также

Добавить к дате и разность дат

Прибавить рабочие дни к дате (Запрос)

Получить дату через указанное количество [дней, месяцев, лет, ...]

Проверка пересечения периодов (интервалов дат) в запросе

РазностьДатПоКалендарю (БСП)

СинтаксисЯзыка (БСП)

Прибавить к дате день

Функции преобразования ЗаписьJSON

Получить дату файла

Модератору