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

markers 54 3 2

Получает разницу дат в указанной единице изменения

// Получение запросом

// Возращает разницу переданных дат в указанном типе разницы
//
// Параметры:
//  МеньшаяДата 	- Меньшая (Начальная) дата, к примеру дата документа
//  БольшаяДата 	- Большая (Конечная) дата, к примеру текущая дата
//  Тип		- Тип разницы, поддерживается: секунда, минута, час, день, неделя, месяц, год
//	ВыбиратьБольшуюДатуПервой - В случае если в качестве меньшей даты, указана большая, можно ли их поменять местами
//
// Порядок указания дат не пренципиален, функция сама определит какая из дат большая.
// По умолчанию тип разницы "день".
// Указывать тип можно в любом регистре.
// Возращает целое число!
//
Функция ПолучитьРазницуДатВ(Знач МеньшаяДата, Знач БольшаяДата, Тип = "день", ВыбиратьБольшуюДатуПервой = Истина) Экспорт

	Тип = НРег(Тип);
	
	Если МеньшаяДата > БольшаяДата и ВыбиратьБольшуюДатуПервой Тогда
		
		ВремДата = БольшаяДата;
		БольшаяДата = МеньшаяДата;
		МеньшаяДата = ВремДата;
		
	ИначеЕсли БольшаяДата = МеньшаяДата Тогда 
		
		Возврат 0;
		
	КонецЕсли;
		
	Если Тип = "сек" или Тип = "секунда" или Тип = "секунды" Тогда Возврат БольшаяДата - МеньшаяДата;
	ИначеЕсли Тип = "мин" или Тип = "минута" или Тип = "минуты" Тогда Тип = "МИНУТА"
	ИначеЕсли Тип = "час" или Тип = "часы" Тогда Тип = "ЧАС"
	ИначеЕсли Тип = "день" или Тип = "дней" или Тип = "дни" Тогда Тип = "ДЕНЬ"
	ИначеЕсли Тип = "неделя" или Тип = "недель" или Тип = "недели" Тогда Тип = "НЕДЕЛЯ"
	ИначеЕсли  Тип = "месяц" или Тип = "месяцев" или Тип = "месяцы" Тогда Тип = "МЕСЯЦ"
	ИначеЕсли Тип = "год" или Тип = "лет" Тогда Тип = "ГОД"
	Иначе Возврат 0;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("БольшаяДата", БольшаяДата);
	Запрос.УстановитьПараметр("МеньшаяДата", МеньшаяДата);
	Запрос.УстановитьПараметр("ВидСравнения", Тип);
	Запрос.Текст= "ВЫБРАТЬ РАЗНОСТЬДАТ(&МеньшаяДата, &БольшаяДата, ДЕНЬ) КАК Разница";
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "ДЕНЬ", Тип);
	Выборка = Запрос.Выполнить().Выбрать(); 
	
	Возврат ?(Выборка.Следующий(), ?(Выборка.Разница <> Null, Выборка.Разница, 0), 0);
		
КонецФункции

// На клиенте

// Возращает разницу переданных дат в указанном типе разницы
//
// Параметры:
//  МеньшаяДата 	- Меньшая (Начальная) дата, к примеру дата документа
//  БольшаяДата 	- Большая (Конечная) дата, к примеру текущая дата
//  Тип		- Тип разницы, поддерживается: секунда, минута, час, день, неделя, месяц, год
//	ВыбиратьБольшуюДатуПервой - В случае если в качестве меньшей даты, указана большая, можно ли их поменять местами
//
// Порядок указания дат не пренципиален, функция сама определит какая из дат большая.
// По умолчанию тип разницы "день".
// Указывать тип можно в любом регистре.
// Возращает целое число!
//
Функция ПолучитьРазницуДатВ(Знач МеньшаяДата, Знач БольшаяДата, Тип = "день", ВыбиратьБольшуюДатуПервой = Истина) Экспорт
	
	Тип = НРег(Тип);
	
	Если МеньшаяДата > БольшаяДата и ВыбиратьБольшуюДатуПервой Тогда
		
		ВремДата = БольшаяДата;
		БольшаяДата = МеньшаяДата;
		МеньшаяДата = ВремДата;
		
	ИначеЕсли БольшаяДата = МеньшаяДата Тогда 
		
		Возврат 0;
		
	КонецЕсли;
	
	Разница = БольшаяДата - МеньшаяДата;	
	
	Если Тип = "сек" или Тип = "секунда" или Тип = "секунды" Тогда
		Возврат Разница;
	ИначеЕсли Тип = "мин" или Тип = "минута" или Тип = "минуты" Тогда
		Возврат Цел(Разница / 60);
	ИначеЕсли Тип = "час" или Тип = "часы" Тогда
		Возврат Цел(Разница / (60*60));
	ИначеЕсли Тип = "день" или Тип = "дней" или Тип = "дни" Тогда 
		Возврат Цел(Разница / (60*60*24));
	ИначеЕсли Тип = "неделя" или Тип = "недель" или Тип = "недели" Тогда
		Возврат Цел(Разница / (60*60*24*7));
	ИначеЕсли  Тип = "месяц" или Тип = "месяцев" или Тип = "месяцы" Тогда
		Возврат Цел(Разница / (60*60*24*30));
	ИначеЕсли Тип = "год" или Тип = "лет" Тогда
		Возврат Цел(Разница / (60*60*24*365));
	Иначе 
		Возврат 0;
	КонецЕсли;
	
КонецФункции
0
{69} Высокая цикломатическая сложность: 28
Орфографическая ошибка в Возращает (найдено 4): Возращает
Орфографическая ошибка в пренципиален (найдено 2): пренципиален

См. также

Как в запросе секунды преобразовать в часы и минуты

Получить представление [разницы] времени

Получить даты за период в запросе

ПолучитьИнтервалВремениИзСтроки (БСП)

ПолучитьНапоминанияТекущегоПользователя (БСП)

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

Цены на дату документа продажи

ПолучитьБлижайшуюДатуСобытияПоРасписанию (БСП)

ПолучитьКурсВалюты (БСП)

Модератору