Сложение дат

Автор Артем Кулигин, 26 сентября 2022, 09:34

0 Пользователи и 1 гость просматривают эту тему.

Артем Кулигин

Здравствуйте.
Пробую перейти на libre с microsoft. Столкнулся с проблемой сложения дат.
К примеру в ячейке А1 стоит "22.03.2022", а в ячейке А2 "=А1+дата(6;1;-2)" (нужно прибавить 6 лет без 1 дня для вычисления окончания поверки счетчика, сама формула пришла из excel, там она тоже работает не идеально, постоянно приходится вручную менять, то "-1", то "-2"). И результат в А2 "21.03.2128". Как-бы верно, но прибавлено ещё 100 лишних лет. А у меня для удобства сделано условное форматирование и как только открыл файл сразу видишь у кого поверка истекла, а у кого - нет.
Даже если прибавить "ДАТА(0;0;0)", всё равно 100 лет добавляет. В старых формулах в части строчек прибавилось 100 лет, в части нет.
Какая логика работы формулы понять не могу

mikekaganski

#1
Добавлять сто лет - как-то неправильно. Не могу навскидку придумать, что такое могло бы это вызвать, так что лучше приложите пример ODS с одной датой и одной формулой. Функция DATE(0;0;0) даёт дату 1999-11-30 (настройка двузначных лет означает, что год "0" воспринимается как 2000; месяц "0" означает месяц перед первым месяцем - январём, т.е. декабрь предыдущего года; день "0" значит день перед первым днём указанного месяца - то есть последний день ноября), и это соответствует почти ровно 100 циклам по 365 дней от "нулевой даны" 1999-12-30. (И учёт двузначной даты - это tdf#151183.)

Но вообще для добавления месяцев и лет к дате не нужно вот такого вот ненадёжного (фактически неправильного) создания дат с помощью ДАТА. Сам заголовок "Сложение дат" отражает это неправильное представление. Вы никогда не складываете даты: это ерунда считать, сколько будет "к первому января две тысячи двадцать второго года прибавить второе марта тысяча девятьсот какого-нибудь года". Вы к дате всегда прибавляете (отнимаете) не дату, а период времени (день, неделю, пару месяцев, шесть лет)...

Пользуйтесь функцией EDATE:

=EDATE(A1;12*6)-1
Насчёт "без одного дня": а зачем? Скажем, в рассматриваемом случае "с 2022-03-22 по 2028-03-21", вероятно, Вы хотели бы день 2028-03-21 включать в указанный диапазон, так что в полдень этого дня ячейка всё ещё зелёная? Конечно, можно использовать функцию TODAY для сравнения с конечной датой, и проверять на равенство. Но концептуально правильнее высчитывать конечную дату без отнятия одного дня, и для проверки использовать "строго меньше":

=TODAY() < EDATE(A1;12*6)
С уважением,
Михаил Каганский

APTEM267

Спасибо за помощь.
Функция ДАТАМЕС() возвращает нужную мне дату.
На счет "без одного дня" - последний день, когда поверка счетчика действует на один день меньше, чем 6 лет, условно "с 2022-03-22 по 2028-03-21", где 21 последний день, 22.03.2028 счетчик считается не прошедшим поверку, т.е. отсутствующим. Поэтому и нужно что-б дата считалась верно (не вижу смысла отнимать в голове вручную каждый раз 1 день, если это можно посчитать). Цвет ячейки используется для моего удобства, а конкретная дата для разговора с потребителями.

mikekaganski

Цитата: APTEM267 от 26 сентября 2022, 21:37На счет "без одного дня" - последний день, когда поверка счетчика действует на один день меньше, чем 6 лет ...

Всё понятно, это обычное дело.
Суть предложения была в том, чтобы заострить внимание на вычислительном аспекте - часто люди не учитывают, что у них могут быть сочетания "дата+время", и такие сочетания в последний день всегда оказываются больше, чем только дата (без времени, т.е. эквивалентно 0:00) этого последнего дня: например, "2028-09-21 03:16" будет позже, чем "2028-09-21" (хотя и раньше, чем "2028-09-22"). Поэтому для расчётов часто удобнее иметь дату следующего дня, и принимать всё, что строго меньше этой даты.

Здорово, что Ваши формулы правильно учитывают особенности Вашего случая.
С уважением,
Михаил Каганский