
Maintenance
Part of Add Business Days: Four Assumptions to Set First
A working brief on add business days formula as of 2027
What the WORKDAY formula really does at the edges: rest-day starts, zero and negative counts, silently ignored text closures, and a hand method that matches.
The formula is one line. What it does at the edges is the article.
=WORKDAY(start, days, [closures])
That returns the date days working days after start, skipping Saturdays, Sundays and anything in closures. The same name and arguments work in Excel and Google Sheets. Every surprising result people get from it comes from one of five edge behaviors, all of them deliberate, none of them documented where you would look.
What to take away
- The start date is day zero. The function never returns the start unless
daysis zero, and it never counts the start as one of the days. - A start on a rest day behaves as if you had started on the last working day before it.
- Nothing on this page computes for you. The cases below were produced by the method, and the hand method at the end reproduces the function without a spreadsheet.
The five edge behaviors
All cases in March 2027, Saturday-Sunday weekend, nothing closed unless stated.
Edge cases in March 2027
Start
- Friday 5th
- 1
- Saturday 6th
- 1
- Saturday 6th
- 0
- Sunday 7th
- -1
- Wednesday 31st
- 1
- Monday 1st
- 10
Days
- Friday 5th
- Monday 8th
- Saturday 6th
- Monday 8th
- Saturday 6th
- Saturday 6th
- Sunday 7th
- Friday 5th
- Wednesday 31st
- Thursday 1 April
- Monday 1st
- Tuesday 16th
Result
- Friday 5th
- Saturday 6th
- Saturday 6th
- Sunday 7th
- Wednesday 31st
- Monday 1st
| Start | Days | Result | What happened |
|---|---|---|---|
| Friday 5th | 1 | Monday 8th | The weekend is skipped, not counted |
| Saturday 6th | 1 | Monday 8th | A rest-day start acts like the preceding Friday |
| Saturday 6th | 0 | Saturday 6th | Zero returns the start unchanged, rest day or not |
| Sunday 7th | -1 | Friday 5th | Negative counts backwards; a rest-day start acts like the following Monday |
| Wednesday 31st | 1 | Thursday 1 April | Month ends are invisible to the function |
| Monday 1st | 10, Wednesday 10th closed | Tuesday 16th | Each weekday closure pushes the result one working day out |
The third row is the one that breaks sheets. A formula that adds zero days to "today" as a way of normalizing to a working day does not normalize anything. If you need the next working day on or after a date, use WORKDAY(date-1, 1).
The round trip that is not one
Add five working days to Monday 1 March and the function gives Monday 8 March. Counting the working days between those Mondays with NETWORKDAYS gives six because it counts both endpoints.
WORKDAY vs NETWORKDAYS
WORKDAY
- Monday 1 March + 5
- Monday 8 March
- Counts
- steps
- Difference
- always one
- Saturday +1 -1
- Friday before
NETWORKDAYS
- Monday 1 March + 5
- six days
- Counts
- members of a set
- Difference
- when both ends working
- Saturday +1 -1
- not inverse
Neither is wrong: one counts steps, the other counts members of a set, and the difference is always exactly one when both ends are working days.
Reverse the step and the trip closes: WORKDAY from Monday 8th with -5 lands on Monday 1st. But start on a Saturday, add one, subtract one, and you land on the Friday before your Saturday, not on the Saturday. The two directions are inverses only between working days.
A different working week
WORKDAY hard-codes Saturday and Sunday. WORKDAY.INTL takes a third argument for the rest days, either a numbered code or a seven-character string read Monday through Sunday with 1 marking a rest day:
=WORKDAY.INTL(start, days, "0000011", closures) Saturday and Sunday
=WORKDAY.INTL(start, days, "0000110", closures) Friday and Saturday
Everything in the edge table holds with the rest days relabeled. A start on a rest day still acts like the last working day before it.
The closures argument
A range of dates. Only entries that fall on a working day change anything; a closure that lands on a rest day is ignored, so you can paste a whole published list without pruning it. Entries stored as text are also ignored, silently, which is the commonest way a sheet gives a confident wrong answer. Check that the column right-aligns.
The list itself is not something a formula can supply and not something this site supplies. Which publisher's list governs, and why it is a body rather than a country, is set out under adding business days.
The hand method
Without a spreadsheet, for a start on a working day:
- Split
daysinto whole weeks and a remainderdays = 5w + r, withrfrom 0 to 4. - Move forward
7wcalendar days. That lands on the same weekday,wweeks later. - Step forward
rworking days one at a time, jumping over Saturday and Sunday when you hit them. - Now walk the resultfor each weekday closure between the start and where you have landed, step forward one more working day, and check whether that step exposed another closure.
Checked against the function on seven cases: Monday 1st plus 5 gives Monday 8th; Monday 1st plus 7 gives Wednesday 10th; Wednesday 3rd plus 3 gives Monday 8th; Thursday 4th plus 4 gives Wednesday 10th. Friday 5th plus 2 gives Tuesday 9th; Friday 5th plus 12 gives Tuesday 23rd; Tuesday 2nd plus 17 gives Thursday 25th. All seven agree.
For a start on a rest day, first move back to the preceding working day, then apply the method. That is what the function does, and it is why the Saturday row in the table behaves as it does. The same rest-day rule decides which start convention a worked example uses, and the fifteen worked examples show all three.
What the formula does not decide
Whether day one is the start day or the day after it. Whether a cut-off hour moves a late trigger to the next day. Whose calendar the closures come from. The function applies one convention, start excluded, whole days, your list, and returns a date that looks equally confident whichever convention the document actually meant.
Read the phrasing first. "Within five business days of receipt", "five business days beginning on the date of the notice" and "five clear business days" are three different counts, and the function will happily produce a date for the wrong one.
The month-level effect, where the same count lands on different dates because months start on different weekdays, is under working days per month. The reverse operation, rounding the other way, is under subtracting business days.
When the same formula runs in a service and a sheet, the contract between the two keeps the answers identical.
Where the arithmetic comes from
None of this is special-purpose calendar code. Stepping over rest days is modular arithmetic on seven, the ordinary modulo operation. The formulas can be written in closed form because a date sits at a position in a repeating cycle.
If you ever need a date's weekday without a tool, that is a solved problem with several published methods. The one most often implemented is Zeller's congruence.
Common questions
Why does adding one day to a Saturday give Monday, not Sunday?
Because Sunday is not a working day and the function only steps through working days. The Saturday itself is treated as if it were the Friday before.
Can I pass a negative number instead of using a subtraction function?
Yes; there is no separate function. Negative days counts backwards, and the same rest-day rule applies in mirror image: a rest-day start acts like the following Monday.
How do I get "the next working day on or after" a date?
=WORKDAY(date-1, 1). Subtracting one first means a working-day date returns itself, and a rest-day date returns the Monday after it.
Does the closures range have to be sorted?
No. Order, duplicates and rest-day entries are all harmless. Text entries are not harmless; they are ignored.







