Каталог решений - Расчет возраста по дате рождения и текущей дате

Расчет возраста по дате рождения и текущей дате

Расчет возраста по дате рождения и текущей дате

В наличии

Была задача — рассчитать возраст определенных лиц по дате их рождения. Решил поискать в интернете, как всегда множество мнений, множество реализаций, но, к сожалению, не встречал той статьи, где рассчитывалось количество полных лет, месяцев и дней.
Например: 28 лет, 3 месяца, 15 дней.

Решил заняться самостоятельно, и вот к чему это привело.

Категория:

Описание

Как известно, в 1С есть неплохие средства работы с датами, которые в данной задаче я и попытался использовать.

И, конечно же, обработка «Консоль запросов»:

Очень помогли мне функции

РАЗНОСТЬДАТ()

и 

ДОБАВИТЬКДАТЕ()

В итоге получил такие запросы, в которых выставил ограничения по количеству записей (500) для отладки информации:

ВЫБРАТЬ ПЕРВЫЕ 500
	Люди.Ссылка КАК Ссылка,
	Люди.ДатаРождения КАК ДатаРождения,
	ВЫБОР
		КОГДА МЕСЯЦ(&ТекущаяДата) < МЕСЯЦ(Люди.ДатаРождения)
			ТОГДА РАЗНОСТЬДАТ(Люди.ДатаРождения, &ТекущаяДата, ГОД) - 1
		КОГДА МЕСЯЦ(&ТекущаяДата) > МЕСЯЦ(Люди.ДатаРождения)
			ТОГДА РАЗНОСТЬДАТ(Люди.ДатаРождения, &ТекущаяДата, ГОД)
		КОГДА МЕСЯЦ(&ТекущаяДата) = МЕСЯЦ(Люди.ДатаРождения)
			ТОГДА ВЫБОР
					КОГДА ДЕНЬ(&ТекущаяДата) < ДЕНЬ(Люди.ДатаРождения)
						ТОГДА РАЗНОСТЬДАТ(Люди.ДатаРождения, &ТекущаяДата, ГОД) - 1
					КОГДА ДЕНЬ(&ТекущаяДата) >= ДЕНЬ(Люди.ДатаРождения)
						ТОГДА РАЗНОСТЬДАТ(Люди.ДатаРождения, &ТекущаяДата, ГОД)
				КОНЕЦ
		ИНАЧЕ "Смотреть"
	КОНЕЦ КАК Количество_лет
ПОМЕСТИТЬ Года
ИЗ
	Справочник.Люди КАК Люди
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 500
	Люди.Ссылка КАК Ссылка,
	Люди.ДатаРождения КАК ДатаРождения,
	ГОДА.Количество_лет КАК Количество_лет,
	ВЫБОР
		КОГДА МЕСЯЦ(&ТекущаяДата) < МЕСЯЦ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
			ТОГДА ВЫБОР
					КОГДА ДЕНЬ(&ТекущаяДата) >= ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
						ТОГДА 
						РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ)
					КОГДА ДЕНЬ(&ТекущаяДата) < ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
						ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
					ИНАЧЕ
						РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
				КОНЕЦ
		КОГДА МЕСЯЦ(&ТекущаяДата) > МЕСЯЦ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
			ТОГДА 
				ВЫБОР
					КОГДА ДЕНЬ(&ТекущаяДата) >= ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
						ТОГДА 
						РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ)
					КОГДА ДЕНЬ(&ТекущаяДата) < ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
						ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
					ИНАЧЕ
						РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
				КОНЕЦ
		КОГДА МЕСЯЦ(&ТекущаяДата) = МЕСЯЦ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
			ТОГДА ВЫБОР
					КОГДА ДЕНЬ(&ТекущаяДата) < ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
						ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
					КОГДА ДЕНЬ(&ТекущаяДата) >= ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
						ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ)
				КОНЕЦ
		ИНАЧЕ "Смотреть"
	КОНЕЦ КАК Количество_месяцев
Поместить ГОДАМЕСЯЦА
ИЗ
	Справочник.Люди КАК Люди
		ЛЕВОЕ СОЕДИНЕНИЕ Года КАК ГОДА
		ПО (Люди.Ссылка = ГОДА.Ссылка)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 500
	Люди.Ссылка КАК Ссылка,
	Люди.ДатаРождения КАК ДатаРождения,
	ГОДАМЕСЯЦА.Количество_лет,
	ГОДАМЕСЯЦА.Количество_месяцев,
	РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(
							ДОБАВИТЬКДАТЕ(
										Люди.ДатаРождения,
										ГОД,
										ВЫРАЗИТЬ(ГОДАМЕСЯЦА.Количество_лет КАК ЧИСЛО)
										),
							МЕСЯЦ,
							ВЫРАЗИТЬ(ГОДАМЕСЯЦА.Количество_месяцев КАК ЧИСЛО)),
				&ТекущаяДата,
				ДЕНЬ
				) КАК Количество_дней
ИЗ
	Справочник.Люди КАК Люди
		ЛЕВОЕ СОЕДИНЕНИЕ ГОДАМЕСЯЦА КАК ГОДАМЕСЯЦА
		ПО (Люди.Ссылка = ГОДАМЕСЯЦА.Ссылка)
;

Хотелось бы, конечно, довести эти запросы до совершенства, но ограничен во времени.

PS.

Не знаю, что делать с такими днями рождения — 29.02.1988. Возраст получаю — 29 лет 1 месяц 30 дней.

Если есть предложения, пишите в комментариях).

has been added to your cart:
Оформление заказа