Разность дат

11.08.17

Разработка - Универсальные функции

Иногда требуется получить разность дат в виде типа: 5 дней 6 месяцев 4 года. Это можно сделать с помощью запроса, получив на выходе сразу 3 нужных числа, без последующих вычислений.

Вот отрывок кода:

	Запрос = Новый запрос("ВЫБРАТЬ
	                      |	ВЫБОР
	                      |		КОГДА РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ДЕНЬ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, МЕСЯЦ), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ), ДЕНЬ) < 0
	                      |			ТОГДА ДЕНЬ(КОНЕЦПЕРИОДА(&Д1, МЕСЯЦ)) + РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ДЕНЬ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, МЕСЯЦ), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ), ДЕНЬ)
	                      |		ИНАЧЕ РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ДЕНЬ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, МЕСЯЦ), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ), ДЕНЬ)
	                      |	КОНЕЦ КАК Дни,
	                      |	ВЫБОР
	                      |		КОГДА РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ДЕНЬ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, МЕСЯЦ), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ), ДЕНЬ) < 0
	                      |			ТОГДА ВЫБОР
	                      |					КОГДА РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, ГОД), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ГОД), МЕСЯЦ) < 0
	                      |						ТОГДА 12 + РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, ГОД), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ГОД), МЕСЯЦ)
	                      |					ИНАЧЕ РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, ГОД), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ГОД), МЕСЯЦ)
	                      |				КОНЕЦ - 1
	                      |		ИНАЧЕ ВЫБОР
	                      |				КОГДА РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, ГОД), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ГОД), МЕСЯЦ) < 0
	                      |					ТОГДА 12 + РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, ГОД), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ГОД), МЕСЯЦ)
	                      |				ИНАЧЕ РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, ГОД), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ГОД), МЕСЯЦ)
	                      |			КОНЕЦ
	                      |	КОНЕЦ КАК Месяцы,
	                      |	ВЫБОР
	                      |		КОГДА РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), МЕСЯЦ) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Д1, ГОД), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ГОД), МЕСЯЦ) < 0
	                      |			ТОГДА РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ГОД) - 1
	                      |		ИНАЧЕ РАЗНОСТЬДАТ(&Д1, ДОБАВИТЬКДАТЕ(&Д2, ДЕНЬ, 1), ГОД)
	                      |	КОНЕЦ КАК Годы");


                Запрос.УстановитьПараметр("Д2",КонечнаяДата);
                Запрос.УстановитьПараметр("Д1",НачальнаяДата);
                ТабДМГ=Запрос.Выполнить().Выгрузить();
                Стр = ТабДМГ[0];

                 Сообщить("Разность дат составляет: "+Стр.Дни+" дней "+Стр.Месяцы+" месяцев "+Стр.Годы+" лет ");

Конечно, можно ещё дописать правильность написания дней, месяцев и лет в зависимости от числа. Но это уже другая тема.

Тут мы вычисляем:

 * для дней - берем общее количество дней в интервале и отнимаем уже учтенное количество дней, а это разница между началами наших месяцев из дат. Это число будет учтено в строке с раcчетом месяца. Но при рачете дней проверяем число полученных дней на отрицателность. Если число дней отрицательно - значит мы перешли в следующий месяц, но фактически месяц между датами еще не прошел. Чтобы учесть это, мы прибавляем к отрицательному числу дней количество дней в месяце первой даты.

 * для месяцев - так же берем общее количество месяцев и отнимаем уже учтенное количество месяцев, а это разница между началами наших лег. Это число уже тоже будет учтено в строке с раcчетом года. Но при расчете месяца также проверяем число полученных месяцев на отрицательность. Если число месяцев отрицательно - значит мы перешли в новый год, но фактически год между датами ещё не прошел. Чтобы учесть это, мы прибавляем к отрицательному числе месяцев 12.

 * для года  - берем количество лет между датами. Но если количество месяцев было отрицательным, то мы отнимаем один год, т.к. он, все же, ещё не прошел.

И я прибавляю ко второй дате один день,т.к. мне нужно чтобы этот последний день был включен в расчет. 

Ну, вот как-то так. Если будут какие-то вопросы - пишите.

Разность дат

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2673    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4613    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3961    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8833    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2077    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16148    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. rybusha 98 11.08.17 13:09 Сейчас в теме
(0)Идея хорошая, но ошибка в днях.
Прикрепленные файлы:
2. user623969_dusa 11.08.17 13:12 Сейчас в теме
високосные года отрабатывает?
3. jun-ko 25 11.08.17 13:15 Сейчас в теме
Високосные отрабатывает.
С днями надо сделать так же как с месяцами. Сейчас сделаю.
4. jun-ko 25 11.08.17 13:35 Сейчас в теме
Дни исправлены ) Спасибо за замечание.
5. rybusha 98 11.08.17 13:45 Сейчас в теме
6. jun-ko 25 11.08.17 13:53 Сейчас в теме
7. TrasserZero 11.08.17 14:36 Сейчас в теме
Отлично. Возьму на вооружение)
8. nytlenc 11.08.17 15:01 Сейчас в теме
Орда непросвещённых, восторгаясь творением выстроились ставить звезды статьям об элементарных вещах!
Скоро статья в которой будет написано 2 + 2 = 4 будет собирать тысячи лайков....
9. jun-ko 25 11.08.17 15:05 Сейчас в теме
(8) Да. Не все достигли такого уровня просвещения, как вы. )
additive; user871995; Help-GROUP; rpgshnik; Dmitri93; +5 Ответить
10. sssss_aaaaa_2011 11.08.17 15:32 Сейчас в теме
(0) А по какой из существующих методик считает сей запрос? Или вы не в курсе о существовании таких? Или может таки появилась одна универсальная методика? Где о ней почитать? В каких месяцах считаем? В январях? Февралях? Средних? Фиксированных?
Почему разница между 29.01.2017 и 01.03.2017 по результатам запроса составляет 1 мес и 4 дня? С какого перепугу? Почему не 1 мес и 1 день под одной самой распространенной методике? Или 0 мес и 30 дней по другой распространенной методике?
alest; rpgshnik; mikele_bes; sasha777666; +4 Ответить
11. psih12 132 11.08.17 16:21 Сейчас в теме
Как аналитик, хочу Вам сказать, что, к примеру одной из самых распространенных ошибок у менеджеров является расчет количества дней продаж того или иного товара за период. Считают они как простая разность дат ДатаКонца-ДатаНачала, не учитывая,что ДатаНачала тоже является днём продажи. К примеру:

ДатаНачала - 01.01
ДатаКонца - 05.01

Количество дней продаж у менеджеров - 5-1= 4 дня

А на самом деле - 5-1+1=5 дней.
Поэтому поддерживаю автора комментария в том,что в запрос необходимо добавить ещё один параметр - учитывать начальную дату или нет - и, соответственно, дописать запрос.
12. пользователь 14.08.17 13:23
Сообщение было скрыто модератором.
...
13. DoctorRoza 16.08.17 10:54 Сейчас в теме
Не вникая в запрос, что если находить РАЗНОСТЬДАТ в виде секунд, а потом их превращать в годы/месяцы/дни? Или, все-таки, городить огород!?
14. sssss_aaaaa_2011 16.08.17 11:52 Сейчас в теме
(13) Сколько секунд в месяце? В каком? А считаем в каких месяцах?

ps: одни пытаются создать вечный двигатель, другие простую формулу расчета разницы дат в нефиксированных единицах измерения. И те, и другие, видимо, до сих пор не знают, что уже доказана невозможность сделать желаемое по законам физики/математики. И тем, и другим кажется, что вот только чуть-чуть доработать и все будет ништяк...
15. rpgshnik 3633 16.08.17 12:48 Сейчас в теме
16. maxis33 45 16.08.17 18:01 Сейчас в теме
Соглашусь про наличие кучи методик.
Например у нас широко используется функция считающая количество месяцев для периода, причем результатом является, например, число 3,43434.. это происходит из за того, что "ставка" - годовая, и выставляется каждый месяц в размере 1/12.
17. DrAku1a 1679 17.08.17 03:25 Сейчас в теме
Ох, люблю я эти извращения! )
18. Altair777 644 18.08.17 12:15 Сейчас в теме
(0) А почему именно запросом?
19. duhh 236 31.10.17 16:09 Сейчас в теме
Криво считает, например 19.11.16 и 31.10.17.
28. additive 10.11.21 10:02 Сейчас в теме
(19)

Также не верно считает период 27.03.17 и 24.03.2020
В результате 3,-1,29 Верное значение 2,11,29
20. sdjoker 37 27.02.18 15:55 Сейчас в теме
а я накидал функцию

// Вычисляет разницу между двух дат
// Параметры:
//   Дата1 - дата - Дата первая
//   Дата2 - дата - Дата вторая
//   Точность - число - результат выполнения функции:
//		0 - лет, месяцев, дней, часов, минут, секунд
//		1 - месяцев, дней, часов, минут, секунд
//		2 - дней, часов, минут, секунд
//		3 - часов, минут, секунд
// 		4 - минут, секунд
//		5 - секунд
//
// Возвращаемое значение:
//	Структура:
//		- Лет - Число - количество лет
//		- Месяцев - Число - количество месяцев
//		- Дней - Число - количество дней
//		- Часов - Число - количество часов
//		- Минут - Число - количество минут
//		- Секунд - Число - количество секунд
//
Функция РазностьДатТиповой(Дата1, Дата2, Точность)
 
	Результат = Новый Структура("Лет,Месяцев,Дней,Часов,Минут,Секунд", 0, 0, 0, 0, 0, 0);
 
	ДатаНач	= ?(Дата1 < Дата2, Дата1, Дата2);
	ДатаКон	= ?(Дата1 < Дата2, Дата2, Дата1);
 
	// Секунды
	Если Точность = 5 Тогда // До секунд
		Результат.Секунд = ДатаКон - ДатаНач;
	Иначе
		Разница = Секунда(ДатаКон) - Секунда(ДатаНач);
		Результат.Секунд = ?(Разница < 0, 60+Разница, Разница);
		ДатаНач = ДатаНач + Результат.Секунд;
	КонецЕсли;
 
	// Минуты
	Если Точность = 4 Тогда // До минут
		Результат.Минут = (ДатаКон - ДатаНач) / 60;	
	ИначеЕсли Точность < 4 Тогда
		Разница = Минута(ДатаКон) - Минута(ДатаНач);
		Результат.Минут = ?(Разница < 0, 60+Разница, Разница);
		ДатаНач = ДатаНач + Результат.Минут * 60;
	КонецЕсли;
 
	// Часы
	Если Точность = 3 Тогда // До часов
		Результат.Часов = (ДатаКон - ДатаНач) / 3600;	
	ИначеЕсли Точность < 3 Тогда
		Разница = Час(ДатаКон) - Час(ДатаНач);
		Результат.Часов = ?(Разница < 0, 24+Разница, Разница);
		ДатаНач = ДатаНач + Результат.Часов * 3600;
	КонецЕсли;
 
	// Дни
	Если Точность = 2 Тогда // До дней
		Результат.Дней = (ДатаКон - ДатаНач) / 86400;	
	ИначеЕсли Точность < 2 Тогда
		Разница = День(ДатаКон) - День(ДатаНач);
		Результат.Дней = ?(Разница < 0, (ДатаКон - ДобавитьМесяц(ДатаКон,-1))/86400 + День(ДатаКон) - День(ДатаНач), Разница);
		ДатаНач = ДатаНач + Результат.Дней * 86400;
	КонецЕсли;
 
	// Месяцы
	Если Точность = 1 Тогда // До месяцев
		Результат.Месяцев = Месяц(ДатаКон) - Месяц(ДатаНач) + (Год(ДатаКон) - Год(ДатаНач)) * 12;	
	ИначеЕсли Точность < 1 Тогда 
		Результат.Месяцев = (Месяц(ДатаКон) - Месяц(ДатаНач) + (Год(ДатаКон) - Год(ДатаНач)) * 12) %12;
		ДатаНач = ДобавитьМесяц(ДатаНач, Результат.Месяцев);
	КонецЕсли;
 
	// Годы
	Если Точность = 0 Тогда // До годов
		Результат.Лет = Год(ДатаКон) - Год(ДатаНач);	
	КонецЕсли;	
 
	Возврат Результат;
 
КонецФункции // ()
Показать
Sintson; BigB; +2 Ответить
21. Tolpinski 65 14.05.18 13:33 Сейчас в теме
На "КОНЕЦ - 1" в каком случае переходим?
09.02.2011 - 04.02.2012 например
22. Tolpinski 65 14.05.18 14:28 Сейчас в теме
В ЗУП 2.5 есть функция в модуле ОбщегоНазначенияЗК, работает на мой взгляд корректнее, да и проще визуально

// Процедура вычисляет количество лет, месяцев и дней между двумя датами
//
// Параметры
// Дата1 – дата, первая дата (более поздняя, часто текущая, стаж определяется по состоянию на эту дату)
// Дата2 – дата, вторая дата (ранняя дата, с нее начинается "течение" стажа)
// Лет – Число, в этот параметр будет записано кол-во лет между двумя датами (Дата1-Дата2)
// Месяцев – Число, в этот параметр будет записано кол-во месяцев между двумя датами (Дата1-Дата2)
// Дней – Число, в этот параметр будет записано кол-во дней между двумя датами (Дата1-Дата2)
//
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт

Лет = 0;
Месяцев = 0;
Дней = 0;
Если Дата1 > Дата2 Тогда

ВременнаяДата = Дата1;
Если День(ВременнаяДата) < День(Дата2) Тогда
Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
КонецЕсли;
Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
Месяцев = 12;
КонецЕсли;
Лет = Макс( Год(ВременнаяДата) - Год(Дата2), 0);
Месяцев = Макс(Месяцев + Месяц(ВременнаяДата) - Месяц(Дата2), 0);
Дней = Макс(Дней + День(ВременнаяДата) - День(Дата2), 0);

// скорректируем отображаемое значение, если "вмешалось" разное количество дней в месяцах
Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
Дней = Дней + ((ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) - Дата2)/86400;
//(День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
КонецЕсли;

КонецЕсли;

КонецПроцедуры // РазобратьРазностьДат
AHang; Aleskey_K; capitan; +3 Ответить
23. BigB 191 25.07.19 14:45 Сейчас в теме
Добавлю свой запрос:
ВЫБРАТЬ
	Годы.Лет КАК Лет,
	РАЗНОСТЬДАТ(Годы.ДХ, &Д2, МЕСЯЦ) - Годы.Х КАК Месяцев,
	РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Годы.ДХ, МЕСЯЦ, РАЗНОСТЬДАТ(Годы.ДХ, &Д2, МЕСЯЦ) - Годы.Х), &Д2, ДЕНЬ) КАК Дней
ИЗ
	(ВЫБРАТЬ
		РАЗНОСТЬДАТ(&Д1, &Д2, ГОД) - ВЫБОР
			КОГДА ДЕНЬГОДА(&Д1) > ДЕНЬГОДА(&Д2) ТОГДА 1
			ИНАЧЕ 0
		КОНЕЦ КАК Лет,
		ДОБАВИТЬКДАТЕ(&Д1, ГОД, РАЗНОСТЬДАТ(&Д1, &Д2, ГОД) - ВЫБОР
				КОГДА ДЕНЬГОДА(&Д1) > ДЕНЬГОДА(&Д2) ТОГДА 1
				ИНАЧЕ 0
			КОНЕЦ) КАК ДХ,
		ВЫБОР
			КОГДА ДЕНЬ(&Д1) > ДЕНЬ(&Д2) ТОГДА 1
			ИНАЧЕ 0
		КОНЕЦ КАК Х) КАК Годы
Показать

Тренировался на датах:
Д1=13.12.1976
Д2=10.08.2017

Д1=29.01.2017
Д2=01.03.2017

Д1=19.11.2016
Д2=31.10.2017

Д1=09.02.2011
Д2=04.02.2012

И сверял с онлайн калькулятором.
Вроде всё работает правильно.
additive; user1252779; +2 Ответить
24. spacecraft 25.07.19 15:28 Сейчас в теме
(23)
Вроде всё работает правильно.

не совсем...
Д1 = 01.03.2015
Д2 = 29.02.2016

Лет = 1
Месяц = -1
Дней = 28
25. BigB 191 29.07.19 11:07 Сейчас в теме
Запрос исправил. Теперь работает правильно.
ВЫБРАТЬ
	Годы.Лет КАК Лет,
	РАЗНОСТЬДАТ(Годы.ДХ, &Д2, МЕСЯЦ) - Годы.Х КАК Месяцев,
	РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Годы.ДХ, МЕСЯЦ, РАЗНОСТЬДАТ(Годы.ДХ, &Д2, МЕСЯЦ) - Годы.Х), &Д2, ДЕНЬ) КАК Дней
ИЗ
	(ВЫБРАТЬ
		РАЗНОСТЬДАТ(&Д1, &Д2, ГОД) - ВЫБОР
			КОГДА ДОБАВИТЬКДАТЕ(&Д1, ГОД, РАЗНОСТЬДАТ(&Д1, &Д2, ГОД)) > &Д2
				ТОГДА 1
			ИНАЧЕ 0
		КОНЕЦ КАК Лет,
		ДОБАВИТЬКДАТЕ(&Д1, ГОД, РАЗНОСТЬДАТ(&Д1, &Д2, ГОД) - ВЫБОР
				КОГДА ДОБАВИТЬКДАТЕ(&Д1, ГОД, РАЗНОСТЬДАТ(&Д1, &Д2, ГОД)) > &Д2
					ТОГДА 1
				ИНАЧЕ 0
			КОНЕЦ) КАК ДХ,
		ВЫБОР
			КОГДА ДЕНЬ(&Д1) > ДЕНЬ(&Д2)
				ТОГДА 1
			ИНАЧЕ 0
		КОНЕЦ КАК Х) КАК Годы
Показать

Период: 31.10.1960 - 30.09.2001
Если смотреть эти калькуляторы
Калькулятов дней
Калькулятор дней
то получается: 40 лет 10 месяцев 30 дней

А если смотреть эти
Калькулятор подсчёта трудового стажа
Калькулятор стажа
то получается: 40 лет 11 месяцев

Вопрос к знатокам: Какой алгоритм правильный?
additive; user1252779; +2 Ответить
27. additive 10.11.21 09:58 Сейчас в теме
(25)
Период: 31.10.1960 - 30.09.2001
Если смотреть эти калькуляторы
Калькулятов дней
Калькулятор дней
то получается: 40 лет 10 месяцев 30 дней


Считаю, что правильный алгоритм "первый", где ответ 40 лет 10 месяцев 30 дней. Так как это реальные значения между датами.

Для стажа есть понятие прерывный и не прерывный.
Для не прерывного всё просто считаем по "первому" алгоритму от даты до даты.
Для прерывного стажа считаем для каждого периода по "первому" алгоритму, а затем складываем Дни, Месяца и Года каждого периода. Дни кратно 30 переходят в месяца, месяца кратно 12 переходят в года.
26. dimisa 135 22.12.20 17:02 Сейчас в теме
Огромное спасибо - сэкономил мне время . Спасибо !!!
29. user1171376 16.02.22 17:55 Сейчас в теме
Спасибо. Все отрабатывает корректно.
Оставьте свое сообщение