РАЗНОСТЬДАТ неверно считает год. Или верно?
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) КАК Месяцев,
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) КАК Дней,
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ГОД) КАК Лет";
Запрос.УстановитьПараметр("НачалоПериода",ОбъектНазначения.НачалоРаботы);
Запрос.УстановитьПараметр("КонецПериода",ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
КонецЕсли;
ПоказатьОбъектНазначения.НачалоРаботы = 2018.11.18
ТекущаяДата() = 2019.10.16
Получаю:
ВыборкаДетальныеЗаписи.Дней = 332. Нет претензий.
ВыборкаДетальныеЗаписи.Месяцев= 11. Нет претензий.
ВыборкаДетальныеЗаписи.Лет= 1. Есть претензия.
Год же еще не прошел. Всего 11 месяцев. почему так считает?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
(=
"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) КАК Месяцев,
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) КАК Дней,
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ГОД) КАК Лет",
| ДОБАВИТЬКДАТЕ(ДатаВремя(1,1,1), ДЕНЬ, РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) как Всего
(=
(8)
Хм, интересный вариант. Но тут спорно. Разница в датах, предположим, 2 месяца и это 01.07. и 01.09. Это 2 месяца по 31 дню. Результат должен быть равным: 0 лет 2 месяца 0 дней. А в результате вашего преобразования получим 2 месяца и 1 день (2 февраля 0001 года).
можно перевести в числа обе даты, вычислить разницу и перевести в дату...
Хм, интересный вариант. Но тут спорно. Разница в датах, предположим, 2 месяца и это 01.07. и 01.09. Это 2 месяца по 31 дню. Результат должен быть равным: 0 лет 2 месяца 0 дней. А в результате вашего преобразования получим 2 месяца и 1 день (2 февраля 0001 года).
В общем, плюнул на эту РазностьДат. Запилил себе личную с Блекджеком и профурсетками.
Прогнал на всех вариантах, вроде работает.
Функция РазностьДатВГодахМесяцахДнях(ДатаНачала,ДатаОкончания)
Результат = Новый Структура("Лет,Месяцев,Дней",0,0,0);
Если Дата(Год(ДатаОкончания),Месяц(ДатаНачала),День(ДатаНачала)) > ДатаОкончания Тогда
Лет = Год(ДатаОкончания) - Год(ДатаНачала) - 1;
Иначе
Лет = Год(ДатаОкончания) - Год(ДатаНачала);
КонецЕсли;
Если Месяц(ДатаОкончания) > Месяц(ДатаНачала) Тогда
Если День(ДатаОкончания) > День(ДатаНачала) Тогда
Месяцев = Месяц(ДатаОкончания) - Месяц(ДатаНачала);
Дней = День(ДатаОкончания) - День(ДатаНачала);
Иначе
Месяцев = Месяц(ДатаОкончания) - Месяц(ДатаНачала) - 1;
Дней = День(ДатаОкончания) + (День(КонецМесяца(ДатаНачала)) - День(ДатаНачала));
КонецЕсли;
ИначеЕсли Месяц(ДатаОкончания) = Месяц(ДатаНачала) Тогда
Если День(ДатаОкончания) > День(ДатаНачала) Тогда
Месяцев = 0;
Дней = День(ДатаОкончания) - День(ДатаНачала);
ИначеЕсли День(ДатаОкончания) < День(ДатаНачала) Тогда
Месяцев = 11;
Дней = День(ДатаОкончания) + (День(КонецМесяца(ДатаНачала)) - День(ДатаНачала));
Иначе
Месяцев = 0;
Дней = 0;
КонецЕсли;
Иначе
Если День(ДатаОкончания) > День(ДатаНачала) Тогда
Месяцев = 12 - Месяц(ДатаНачала) + Месяц(ДатаОкончания);
Дней = День(ДатаОкончания) - День(ДатаНачала);
Иначе
Месяцев = 12 - Месяц(ДатаНачала) + Месяц(ДатаОкончания) - 1;
Дней = День(ДатаОкончания) + (День(КонецМесяца(ДатаНачала)) - День(ДатаНачала));
КонецЕсли;
КонецЕсли;
Результат.Лет = Лет;
Результат.Месяцев = Месяцев;
Результат.Дней = Дней;
Возврат Результат;
КонецФункции // РазностьДатВГодахМесяцахДнях()
ПоказатьПрогнал на всех вариантах, вроде работает.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот