Почему стандартное вычитание дат не всегда работает
На первый взгляд, вычесть одну дату из другой в Microsoft Excel проще простого: достаточно ввести формулу =B2-A2, и программа сама покажет количество дней между значениями. Но что, если вам нужно узнать не просто дни, а полные годы, месяцы или рабочие дни без выходных? Или учесть производственный календарь с праздничными датами?
Дело в том, что Excel хранит даты как последовательные числа (начиная с 1 января 1900 года = 1), и простое вычитание возвращает только абсолютное количество дней. Для более сложных расчётов требуются специальные функции — от DATEDIF до комбинаций с NETWORKDAYS. В этой статье разберём все варианты — от базовых до продвинутых, включая обработку ошибок и автоматизацию через Power Query.
Предупреждение: если вы работаете с датами до 1900 года или используете Excel для Mac версии старше 2011 года, некоторые функции могут давать сбои. Об этом — в разделе про ошибки.
Способ 1: Базовое вычитание дат (количество дней)
Самый простой метод — вычесть одну дату из другой. Excel автоматически преобразует результат в количество дней, так как внутренне хранит даты как числа.
Пример: если в ячейке A1 указана дата 01.01.2023, а в B1 — 15.01.2023, формула =B1-A1 вернёт 14.
- ✅ Плюсы: работает во всех версиях Excel, не требует специальных функций.
- ❌ Минусы: не учитывает месяцы/годы, не фильтрует выходные.
⚠️ Внимание: если результат отображается как дата (например,14.01.1900), измените формат ячейки наОбщийилиЧисловой.
Ячейки содержат корректные даты (не текст)|Формат ячеек — "Дата"|Результат вычитания отформатирован как число-->
Способ 2: Функция DATEDIF — расчёт лет, месяцев и дней
Функция DATEDIF (от англ. Date Difference) — скрытая "фишка" Excel, которой нет в списке мастер-функций. Она позволяет вычислить разницу в годах, месяцах или днях с учётом календарных правил.
Синтаксис:
DATEDIF(начальная_дата; конечная_дата; единица_измерения)
Аргумент единица_измерения может принимать значения:
- 📅
"Y"— полные годы между датами. - 📆
"M"— полные месяцы (игнорирует годы). - 📇
"D"— дни (игнорирует месяцы и годы). - 📅📆
"YM"— месяцы без учёта полных лет. - 📅📇
"MD"— дни без учёта полных месяцев и лет. - 📅📆📇
"YD"— дни между датами, как если бы они были в одном году.
Пример: формула =DATEDIF("01.05.2020"; "15.08.2023"; "Y") вернёт 3 (полных года), а =DATEDIF("01.05.2020"; "15.08.2023"; "YM") — 3 (месяца сверх полных лет).
| Единица измерения | Формула | Результат для дат01.01.2020 – 15.03.2023 |
|---|---|---|
"Y" |
=DATEDIF(A1;B1;"Y") |
3 |
"M" |
=DATEDIF(A1;B1;"M") |
38 |
"D" |
=DATEDIF(A1;B1;"D") |
1160 |
"YM" |
=DATEDIF(A1;B1;"YM") |
2 |
⚠️ Внимание: если начальная дата позже конечной,DATEDIFвернёт ошибку#ЧИСЛО!. Используйте=ABS(DATEDIF(...))для абсолютного значения.
Способ 3: Рабочие дни (исключаем выходные и праздники)
Для расчёта только рабочих дней (понедельник–пятница) используйте функцию NETWORKDAYS:
NETWORKDAYS(начальная_дата; конечная_дата; [праздники])
Необязательный аргумент [праздники] — это диапазон ячеек с датами, которые также нужно исключить (например, государственные праздники).
Пример: если в ячейках A1 и B1 указаны даты 01.01.2023 и 31.01.2023, а в диапазоне D1:D2 перечислены праздники 07.01.2023 и 08.01.2023, формула будет:
=NETWORKDAYS(A1; B1; D1:D2)
- 📅 Важно: по умолчанию
NETWORKDAYSсчитает выходными субботу и воскресенье. Для других дней недели используйтеNETWORKDAYS.INTL. - 📊 Пример с нестандартными выходными:
=NETWORKDAYS.INTL(A1; B1; 11; D1:D2)Здесь
11— код для выходныхвоскресенье+понедельник.
Коды выходных дней для NETWORKDAYS.INTL
1 — суббота+воскресенье (по умолчанию)
2 — воскресенье+понедельник
3 — понедельник+вторник
...
11 — только воскресенье
12 — только понедельник
17 — только суббота
Способ 4: Разница в месяцах и годах с учётом неполных периодов
Если нужно получить разницу в месяцах или годах с десятичными долями (например, 2.5 месяца), используйте комбинацию функций:
Для месяцев:
=DATEDIF(A1;B1;"M") + (DAY(B1)-DAY(A1))/30
Для лет:
=DATEDIF(A1;B1;"Y") + DATEDIF(A1;B1;"YM")/12 + (DAY(B1)-DAY(A1))/365
Эти формулы учитывают дробную часть периода, но имеют погрешность из-за усреднённого количества дней в месяце/году. Для точных расчётов (например, в бухгалтерии) лучше использовать DATEDIF с разделением на полные и неполные периоды.
⚠️ Внимание: при расчёте возраста сотрудников или сроков договоров избегайте дробных лет/месяцев — это может привести к юридическим ошибкам. Используйте отдельные столбцы для полных и неполных периодов.
Способ 5: Продвинутый расчёт через Power Query
Если вам нужно обработать тысячи строк с датами или создать динамический отчёт, используйте Power Query (вкладка Данные → Получение данных). Этот инструмент позволяет:
- 📊 Автоматически вычислять разницу между датами при импорте данных.
- 🔄 Обновлять результаты одним кликом при изменении исходных данных.
- 📅 Создавать пользовательские столбцы с формулами на языке M.
Пример кода для Power Query, который добавляет столбец с разницей в днях:
let
Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
ДобавленСтолбец = Table.AddColumn(Источник, "РазницаДней", each Duration.Days([КонечнаяДата] - [НачальнаяДата]))
in
ДобавленСтолбец
Для расчёта лет и месяцев используйте:
Table.AddColumn(Источник, "РазницаЛет", each Date.Year([КонечнаяДата]) - Date.Year([НачальнаяДата]) - IF(Date.From([КонечнаяДата]) < Date.From(Date.StartOfYear([КонечнаяДата]))) THEN 1 ELSE 0)
Типичные ошибки и как их избежать
Даже опытные пользователи Excel сталкиваются с ошибками при работе с датами. Вот самые распространённые:
- Текст вместо даты: если ячейка содержит текст (например,
"01.01.2023"вместо даты), Excel вернёт ошибку. Решение: используйте=ДАТАЗНАЧ(A1)для преобразования. - Неправильный формат: даты в формате
дд.мм.ггггимм/дд/ггггExcel может путать. Решение: явно укажите формат черезФормат ячеек → Дата. - Отрицательная разница: если начальная дата позже конечной,
DATEDIFвернёт#ЧИСЛО!. Решение: используйте=ABS(DATEDIF(...)). - 1900 vs 1904: в Excel для Mac (до 2011 года) система дат начинается с
1904 года, а не 1900. Решение: проверьте настройки вПараметры Excel → Дополнительно → При переходе на эту книгу → Система дат 1904.
Критическая ошибка: если вы работаете с финансовыми отчётами, никогда не используйте простую разницу дней для расчёта процентов — это нарушает стандарты PSAK 35 (для России) и IAS 1 (международные). Используйте ДОЛЯГОДА или ДНЕЙ360.
FAQ: Ответы на частые вопросы
Как посчитать количество полных недель между датами?
Используйте формулу:
=ЦЕЛОЕ((B1-A1)/7)
Где A1 и B1 — начальная и конечная даты. Для остатка дней (неполных недель) добавьте:
=ОСТАТ((B1-A1);7)
Почему DATEDIF возвращает неверное количество месяцев?
Функция DATEDIF считает полные месяцы. Например, между 31.01.2023 и 01.03.2023 будет 1 месяц, а не 2, так как 28/29 февраля не хватает для полного месяца. Для альтернативного расчёта используйте:
=ГОД(B1)*12+МЕСЯЦ(B1) - (ГОД(A1)*12+МЕСЯЦ(A1))
Как учесть региональные праздники в NETWORKDAYS?
Создайте отдельный лист с перечнем праздничных дат для вашего региона (например, 01.01.2023, 07.01.2023 и т.д.). Затем ссылайтесь на этот диапазон в аргументе [праздники]:
=NETWORKDAYS(A1; B1; Праздники!A2:A10)
Для автоматического обновления праздников используйте Power Query с подключением к государственному календарю (например, через API data.gov.ru).
Можно ли рассчитать разницу между датой и временем?
Да, но для этого нужно объединить дату и время в одном формате. Например:
=B1-A1
Где A1 = 01.01.2023 10:00, а B1 = 02.01.2023 15:30. Результат будет в днях (например, 1,229...). Чтобы перевести в часы, умножьте на 24:
=(B1-A1)*24
Как посчитать возраст человека в Excel?
Используйте комбинацию DATEDIF для полных лет, месяцев и дней:
=DATEDIF(A1;TODAY();"Y") & " лет, " & DATEDIF(A1;TODAY();"YM") & " мес., " & DATEDIF(A1;TODAY();"MD") & " дн."
Где A1 — дата рождения, а TODAY() — текущая дата. Для русскоязычного формата замените "Y" на "Г" (в русской версии Excel).