БСП разность дат в виде лет...месяцев...дней

1. NatalkaBal 29 19.12.23 13:10 Сейчас в теме
Добрый день, подскажите функцию в БСП которая возвращает разность дат в виде n лет m месяцев d дней
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. vladimir_korshun 87 19.12.23 14:48 Сейчас в теме
(1)

// Пример: РазницаМеждуДатами(Дата(1991, 08, 05, 01, 01, 01),ТекущаяДата(),"лет");  
Функция РазницаМеждуДатами(НачалоПериода, КонецПериода, Период = "ЧАС") Экспорт
	                   
	Если Период = "" Тогда 
		Период = "ЧАС";  			
	КонецЕсли;                  
	
	Период = ВРег(Период);
	
	Период = СтрЗаменить(Период, "СЕКУНД","СЕКУНДА"); 
	Период = СтрЗаменить(Период, "СЕК","СЕКУНДА");
	Период = СтрЗаменить(Период, "МИНУТ","МИНУТА");
	Период = СтрЗаменить(Период, "МИН","МИНУТА"); 
	Период = СтрЗаменить(Период, "ЧАСОВ","ЧАС"); 
	Период = СтрЗаменить(Период, "ДНЕЙ","ДЕНЬ"); 	
	Период = СтрЗаменить(Период, "ЛЕТ","ГОД");
	
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ГОД) КАК ГОД,
		|	РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) КАК МЕСЯЦ,
		|	РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) КАК ДЕНЬ,
		|	РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ЧАС) КАК ЧАС,
		|	РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МИНУТА) КАК МИНУТА,
		|	РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, СЕКУНДА) КАК СЕКУНДА";  
	
	Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
	Запрос.УстановитьПараметр("КонецПериода", КонецПериода);  
	
	Если КонецПериода > НачалоПериода Тогда
		Результат = Запрос.Выполнить().Выгрузить();
		
		Если Период = "ГОД" Тогда 		   Возврат Результат[0].ГОД;
		ИначеЕсли  Период = "МЕСЯЦ" Тогда  Возврат Результат[0].МЕСЯЦ;	
		ИначеЕсли  Период = "ДЕНЬ" Тогда   Возврат Результат[0].ДЕНЬ;
		ИначеЕсли  Период = "ЧАС" Тогда    Возврат Результат[0].ЧАС;
		ИначеЕсли  Период = "МИНУТА" Тогда Возврат Результат[0].МИНУТА;
		ИначеЕсли  Период = "СЕКУНДА" Тогда Возврат Результат[0].СЕКУНДА;
			
		КонецЕсли;				
	КонецЕсли;  
	
	Возврат 0;
	
КонецФункции

Показать
9. NatalkaBal 29 19.12.23 15:28 Сейчас в теме
(7)очень хорошо, но формат в виде: прошло 3 года 2 месяца и 11 дней не получится так получить
15. user654641_yaga_m 13 21.12.23 18:12 Сейчас в теме
(1)дайте личку, сброшу свой вариант...
16. user654641_yaga_m 13 27.12.23 20:08 Сейчас в теме
(1)ДВ, опубликовал - можете скачать..
2. user654641_yaga_m 13 19.12.23 13:17 Сейчас в теме
ДД, такой нет, по крайней мере я не нашел, сам неделю назад искал - ничего "красивого" не нашел...)) Пришлось самому писать. Готовлю статью для сообщества... если модератор пропустит.
3. NatalkaBal 29 19.12.23 13:26 Сейчас в теме
Думаю пропустит) а вы учитывали календари при формирования результата?
(2)
4. user654641_yaga_m 13 19.12.23 13:28 Сейчас в теме
6. NatalkaBal 29 19.12.23 13:54 Сейчас в теме
(4)Чтоб подсчитать количество дней
8. user654641_yaga_m 13 19.12.23 15:23 Сейчас в теме
(6)а вы учитывали календари - я про это?
13. NatalkaBal 29 19.12.23 15:38 Сейчас в теме
(8)я решила чтоб знать сколько дней в месяце нужны календари. Например если запросом взять разность дат в днях, определить сколько в них месяцев

Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ
			|	РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, ГОД) КАК Год,
			|	РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, МЕСЯЦ) КАК Месяц";
		Запрос.УстановитьПараметр("ДатаНачало", ДатаПриема);
		Запрос.УстановитьПараметр("ДатаКонец", КонечнаяДата);
		
		РезультатЗапроса = Запрос.Выполнить();
		ВыборкаДат = РезультатЗапроса.Выбрать();
		Пока ВыборкаДат.Следующий() Цикл
			Год   = ВыборкаДат.Год;
			Месяц = ВыборкаДат.Месяц - Год*12;
		КонецЦикла;
Показать


тут я нашла формат лет...месяцев, а вот с днями проблема
14. Said-We 20.12.23 01:45 Сейчас в теме
(13)
определить сколько в них месяцев
В конечном итоге будите делать поправки на високосные года, количество дней в месяцах и придете к тому же алгоритму в {10} :-)
Примерно этот алгоритм реализован и в ЗиК 77 и в программах на FoxPro и в онлайн калькуляторах. Велосипед тут изобретать не нужно. Либо взять готовый вариант 1, либо взять готовый вариант 2, 3, 4,... либо ещё какой. Выбор за вами.
Если в БСП такой функции нет, то придется её писать, либо брать из специализированных конфигураций - любая где есть расчет стажа. Алгоритм может быть простым, но не сильно точным. Посложнее поточнее. Но совсем правильного не существует. На бумаге есть споры о правильном результате. :-) Поэтому определите степень точности, который вам нужен и используйте.
5. laperuz 47 19.12.23 13:37 Сейчас в теме
В БСП нет, но можно взять из ЗУП, используется для отображения стажа физлица.
10. Said-We 19.12.23 15:28 Сейчас в теме
(1) Вычисление разности дат в годах, днях и месяцах запросом.
https://forum.mista.ru/topic.php?id=822447
11. user654641_yaga_m 13 19.12.23 15:32 Сейчас в теме
(10)очень "много и сложно"
NatalkaBal; +1 Ответить
12. Said-We 19.12.23 15:37 Сейчас в теме
(11) Иногда надо запросом, что бы в цикле не вызывать.
Функцию, которую Вы ищите должна делать примерно тоже самое, что и онлайн калькулятор календаря.
По сути это как раз примерно такой же алгоритм. В котором необходимо учесть високосный год или нет. 30 дней это уже месяц или ещё нет и т.д. :-)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот