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

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

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

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

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

Странный запрос в (1) и процедура в (6) странная, и считает не правильно, для 27.04.2017 - 29.02.1988 выдала: "Лет: 29 Месяцев: 1 Дней: 30".

У меня запрос из трех строк выдает следующее:

27.04.2017 - 29.02.1988 = 29 лет 1 мес 27 дней 03.05.2017 - 29.02.1988 = 29 лет 2 мес 3 дня

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

(11) Ну я считал так:

29.02.1988 - 28.02.2017 = 29 лет 01.03.2017 - 30.04.2017 = 2 мес 01.05.2017 - 03.05.2017 = 3 дня

поправьте меня, где я потерял день?

В моем понимании, 29.02.1988 не должно считаться за день в этом расчете - это собсна день рождения, в этот день у человека "полный год", а вот со след. дня и пошел расчет . "между прочим" )).

А "високосный" Вы по прежнему считаете не правильно. А саму конструкцию проверки високосного я бы сделал так: "Год(ДатаР) % 4". Ваш способ, конечно, оригинален, я бы не додумался. Скорее всего я бы сделал так: День(КонецМесяца(ДатаР)) = 29 . вау ))))))))

И еще, у Вас если д/р 29.02.1988, то Високосный = 1, а если 28.02.1988, то Високосный = 0 . странно все ето ))) ужОс !!

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

(16) Да, Вы правы. Я зачем-то считал календарные месяцы, вместо реальных.

Переделал запрос, теперь все четко:

  • Скопировать ссылку
  • Перейти

Каков возраст на 01.03.2019 в полных годах, если дата рождения будет 29.02.2008, покажет Ваш запрос ?

У меня Ваш запрос показал след. результаты:

ДатаРождения ТекущаяДата Условие ПолныхЛет

29.02.2008 0:00:00 01.03.2019 0:00:00 > 12 29.02.2008 0:00:00 01.03.2019 0:00:00 >= 12

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

(43) Ой, не к тому сообщению написал . это я к сообщению № 40

Мои расчеты показывают такой же результат )), а вот у ребят как-то странно!

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

. НЕ кратен 100, либо кратен 400 .

Мой мозг не смог впитать сие .

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

Да, я видимо, застрял в юлианском календаре. Теперь вместо "Год % 4" буду делать

Кстати, в 1С 400,800,1200 - високосные, т.е. уже не важно, что запустили в 1582 году )).

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

(20) Вчера гонял Ваш предыдущий вариант на ошибки и видел что на 28 числе они были, сейчас проверим новый вариант )).

Думаю, что и в Вашем варианте и в варианте из (22) будут ошибки, а думаю так, потому что Вы используете деление на "сутки". Чисто математически, очевидно, что при расчете за 1000 лет "что-то пойдет не так".

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

На всякий случай, замечу, что я в своих расчетах не использую определение "високосности".

А Ваш цикл расчета месяцев всегда будет "грешить", т.к. конец месяца будет сбиваться не только в феврале и не обязательно в високосный год:

- 29.11.2016 + з мес = 28.02.2017 ( 29 -> 28 ) - 31.03.2017 + 3 мес = 30.06.2017 ( 31 -> 30 )

имеется в виду ДобавитьМесяц(Дата, 3).

Задайте ДР = 31.03.1975 и ДТ = 29.01.2017:

- старый = Лет: 41 Месяцев: 10 Дней: 1 - новый = Лет: 41 Месяцев: 9 Дней: 30

- д.быть = 29.01.2017 = 41 - 09 - 29.

  • Скопировать ссылку
  • Перейти

Тут вот еще замер производительности сделал, вариант (26) с циклом, явно проигрывает:

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

Очешуеть . в алгоритме должно быть две даты на входе - Дата рождения и Текущая.

Какая "ЛюбаяДата" ? Вы чего?

  • Скопировать ссылку
  • Перейти

Вот мой реально работающий код в отчете:

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

Вроде можно проще:

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

(38) Дали задачу в ЗУП 3.1 посчитать стаж работника на предприятии относительно даты приёма. Чтоб не рисовать новый код и отчёт, взял отчёт "Штатные сотрудники". Изменяя вариант, добавил в предприятии 3 пользовательских поля-выражения:

Лет, выражение: РазностьДат([Дата приема], ТекущаяДата(), "ГОД") + Выбор Когда Месяц([Дата приема]) < Месяц(ТекущаяДата()) Или Месяц([Дата приема]) = Месяц(ТекущаяДата()) И День([Дата приема]) <= День(ТекущаяДата()) Тогда 0 Иначе -1 Конец

Месяцев, выражение: (РазностьДат(ДобавитьКДате([Дата приема], "Месяц", 1), ТекущаяДата(), "МЕСЯЦ") + Выбор Когда День([Дата приема]) <= День(ТекущаяДата()) Тогда 1 Иначе 0 Конец) % 12

Дней, выражение: Выбор Когда День([Дата приема]) <= День(ТекущаяДата()) Тогда День(ТекущаяДата()) - День([Дата приема]) Иначе День(ТекущаяДата()) + РазностьДат([Дата приема], КонецПериода([Дата приема], "Месяц"), "День") Конец + 1.

В детальных записях их вывел и сгруппировал в группу "Стаж на предприятии". Кадровики довольны. Но это писал на языке СКД, в обычных запросах надо дописать несколько строк, чтобы получить остаток от деления на 12 при вычислении полных месяцев, а текущую дату втыкать параметром в запрос. Думаю, в решении Вашей задачи вполне может помочь.

📎📎📎📎📎📎📎📎📎📎