РАЗНОСТЬДАТ неверно считает год. Или верно?

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

Если ВыборкаДетальныеЗаписи.Следующий() Тогда
	
КонецЕсли;
Показать

ОбъектНазначения.НачалоРаботы = 2018.11.18
ТекущаяДата() = 2019.10.16

Получаю:
ВыборкаДетальныеЗаписи.Дней = 332. Нет претензий.
ВыборкаДетальныеЗаписи.Месяцев= 11. Нет претензий.
ВыборкаДетальныеЗаписи.Лет= 1. Есть претензия
.
Год же еще не прошел. Всего 11 месяцев. почему так считает?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. AndrewKop 16.10.19 12:00 Сейчас в теме
За ссылку спасибо, теперь понятно, как она работает.
Буду тогда года считать целочисленным делением месяцев на 12.
4. user5300 1019 16.10.19 11:49 Сейчас в теме
(1) Берется Год:
2018.11.18 = 2018
2019.10.16 = 2019

Итог = 2019 - 2018 = 1
AndrewKop; +1 Ответить
5. user5300 1019 16.10.19 11:55 Сейчас в теме
(1)
 "ВЫБРАТЬ
               |    РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) КАК Месяцев,
               |    РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) КАК Дней,
               |    РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ГОД) КАК Лет",
               |    ДОБАВИТЬКДАТЕ(ДатаВремя(1,1,1), ДЕНЬ, РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) как Всего 

(=
7. AndrewKop 16.10.19 12:16 Сейчас в теме
(5) Не совсем понял о чем вы) Ну... дней как раз хватило на 11 месяцев. Так что с ними все верно и с месяцами тоже вроде. Или я чего-то не догоняю)
8. user_2010 911 16.10.19 15:04 Сейчас в теме
(1) вы неправильно логически считаете время между двумя датами - алгоритм сложнее, чем просто вычесть дни из дней, месяца из месяцев, год из года...!
можно перевести в числа обе даты, вычислить разницу и перевести в дату...
12. AndrewKop 16.10.19 16:22 Сейчас в теме
(8)
можно перевести в числа обе даты, вычислить разницу и перевести в дату...

Хм, интересный вариант. Но тут спорно. Разница в датах, предположим, 2 месяца и это 01.07. и 01.09. Это 2 месяца по 31 дню. Результат должен быть равным: 0 лет 2 месяца 0 дней. А в результате вашего преобразования получим 2 месяца и 1 день (2 февраля 0001 года).
13. user_2010 911 16.10.19 17:23 Сейчас в теме
9. spacecraft 16.10.19 15:25 Сейчас в теме
(1)
ВыборкаДетальныеЗаписи.Месяцев= 11. Нет претензий.
ВыборкаДетальныеЗаписи.Лет= 1. Есть претензия.

Значит к годам есть претензия, а к месяцам нет? Где логика?
11. AndrewKop 16.10.19 16:08 Сейчас в теме
(9) Заметил уже когда опубликовал топик.
3. Alexandr73Rus 16.10.19 11:47 Сейчас в теме
2019 - 2018 = 1 или 2019 - 2018 = 0?
10. AndrewKop 16.10.19 16:06 Сейчас в теме
В общем, плюнул на эту РазностьДат. Запилил себе личную с Блекджеком и профурсетками.

Функция РазностьДатВГодахМесяцахДнях(ДатаНачала,ДатаОкончания)

	Результат = Новый Структура("Лет,Месяцев,Дней",0,0,0);
		
	Если Дата(Год(ДатаОкончания),Месяц(ДатаНачала),День(ДатаНачала)) > ДатаОкончания Тогда
		Лет = Год(ДатаОкончания) - Год(ДатаНачала) - 1;
	Иначе
		Лет = Год(ДатаОкончания) - Год(ДатаНачала);
	КонецЕсли;
	
	Если Месяц(ДатаОкончания) > Месяц(ДатаНачала) Тогда
		Если День(ДатаОкончания) > День(ДатаНачала) Тогда
			Месяцев = Месяц(ДатаОкончания) - Месяц(ДатаНачала);
			Дней = День(ДатаОкончания) - День(ДатаНачала);
		Иначе
			Месяцев = Месяц(ДатаОкончания) - Месяц(ДатаНачала) - 1;                                
			Дней = День(ДатаОкончания) + (День(КонецМесяца(ДатаНачала)) - День(ДатаНачала));
		КонецЕсли;
	ИначеЕсли Месяц(ДатаОкончания) = Месяц(ДатаНачала) Тогда
		Если День(ДатаОкончания) > День(ДатаНачала) Тогда
			Месяцев = 0;
			Дней = День(ДатаОкончания) - День(ДатаНачала);
		ИначеЕсли День(ДатаОкончания) < День(ДатаНачала) Тогда
			Месяцев = 11;
			Дней = День(ДатаОкончания) + (День(КонецМесяца(ДатаНачала)) - День(ДатаНачала));
		Иначе
			Месяцев = 0;
			Дней = 0;
		КонецЕсли;
	Иначе
		Если День(ДатаОкончания) > День(ДатаНачала) Тогда
			Месяцев = 12 - Месяц(ДатаНачала) + Месяц(ДатаОкончания);
			Дней = День(ДатаОкончания) - День(ДатаНачала);
		Иначе
			Месяцев = 12 - Месяц(ДатаНачала) + Месяц(ДатаОкончания) - 1;
			Дней = День(ДатаОкончания) + (День(КонецМесяца(ДатаНачала)) - День(ДатаНачала));
		КонецЕсли;
	КонецЕсли;
	
	Результат.Лет = Лет;
	Результат.Месяцев = Месяцев;
	Результат.Дней = Дней;

	Возврат Результат;
КонецФункции // РазностьДатВГодахМесяцахДнях()
Показать


Прогнал на всех вариантах, вроде работает.
Оставьте свое сообщение

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