TODAY
VANDAAG in Dutch Excel
Returns the current date, without a time, and updates it every time the workbook recalculates.
Last updated: 13 October 2026
| Row | A | B | C |
|---|---|---|---|
| 1 | Confirmation | Request sent | Days outstanding |
| 2 | BC-01 | 14 Sep 2026 | 1616=TODAY() - B2=TODAY() - B2 |
| 3 | BC-02 | 21 Sep 2026 | |
| 4 | BC-03 | 28 Aug 2026 |
Swipe sideways to see all columns
Result: 16
=TODAY() - B2
=TODAY() - B2
What TODAY does and when to use it
What it does: it gives the current date as a serial number, for example to count how many days a bank confirmation request has been outstanding.
When to use it: for anything measured against the current date, such as days until a deadline, days overdue or contracts that expire soon. Use NOW when the time of day matters too.
How Excel evaluates it
When Excel calculates the cell:
- it reads the date from your computer's clock and returns it as a whole serial number, the count of days since 1 January 1900, with no fraction for the time; 30 September 2026 is 46295
- it gives the cell a date format if the cell had no format yet
- from then on it recalculates TODAY whenever anything in the workbook recalculates, including when the file is opened, so tomorrow the same cell shows 46296
If calculation is set to Manual, the value stays as it was until you recalculate.
Watch out: When a report must keep showing the figures as at a fixed date, such as a year-end file, do not use TODAY: type the report date into a cell and refer to that.
Mental model
A tear-off desk calendar that turns its own page: the cell always shows the top sheet, and you never see yesterday's date unless you tear the page off and keep it (paste as values).
Terms used on this page: workbook, serial number, cell
TODAY()
TODAY()
Return value:Today's date as a serial number
Formulas use commas (,) between arguments, as in English Excel. Formulas use semicolons (;) between arguments, as in Dutch Excel. Formulas use commas (,) between arguments, as in English Excel; Dutch Excel uses semicolons (;).
Worked examples
Beginner
Days since a bank confirmation request was sent
For the year-end audit of Veldhuis Installatie BV you sent three bank confirmation requests. Your follow-up list needs a column with the number of days each request has been outstanding, and it must be correct every morning without anyone updating it. The example assumes today is 30 September 2026.
| Row | A | B | C | D |
|---|---|---|---|---|
| 1 | Confirmation | Request sent | Days outstanding | |
| 2 | BC-01 | 14 Sep 2026 | 1616=TODAY() - B2=TODAY() - B2 | |
| 3 | BC-02 | 21 Sep 2026 | ||
| 4 | BC-03 | 28 Aug 2026 | ||
| 5 |
Swipe sideways to see all columns
Formula in C2
=TODAY() - B2
=TODAY() - B2
Result: 1616
Step by step
- TODAY() reads the computer's date. On 30 September 2026 it returns 46295, with no time part.
- Excel reads
B2: 14 September 2026, stored as serial number 46279. - Excel subtracts: 46295 - 46279 = 16. The request for
BC-01has been outstanding for 16 days. - Copied down,
BC-02(21 September, 46286) gives 46295 - 46286 = 9 andBC-03(28 August, 46262) gives 46295 - 46262 = 33. - On the day you open the example, TODAY() returns your own date, so your numbers will differ. Tomorrow the same cell shows 17, without anyone touching it.
Watch out: If C2 shows 16-1-1900 instead of 16, the cell carries a date format (Excel sometimes applies one to formulas that refer to dates). Set the cell to General or Number.
More on this example: why it works, 1 more pitfall
Why it works
Dates are day counts, so subtracting one date from another gives the number of days between them. Because TODAY is worked out again on every recalculation, the difference grows by 1 each day.
More to watch out for
- The result counts calendar days, weekends included. If your firm chases confirmations after a number of working days, use NETWORKDAYS instead.
Intermediate
Days overdue per open invoice, zero if not yet due
You are preparing the receivables aging analysis for a client and have the open invoices from the receivables ledger with their due dates. You need a column with the number of days each invoice is overdue, as the basis for the 30, 60 and 90-day bands.
Invoices that are not due yet, or are due today, must show 0 rather than a negative number. The example assumes today is 30 September 2026.
| Row | A | B | C | D | E |
|---|---|---|---|---|---|
| 1 | Invoice no. | Relation | Due date | Days overdue | |
| 2 | 26-3101 | D1042 | 15 Sep 2026 | 1515=IF(TODAY() > C2, TODAY() - C2, 0)=IF(TODAY() > C2; TODAY() - C2; 0) | |
| 3 | 26-3102 | D1017 | 14 Oct 2026 | ||
| 4 | 26-3103 | D1021 | 30 Sep 2026 | ||
| 5 | 26-3104 | D1042 | 2 Jul 2026 | ||
| 6 | 26-3105 | D1033 | 14 Aug 2026 | ||
| 7 |
Swipe sideways to see all columns
Formula in D2
=IF(TODAY() > C2,TODAY() - C2, 0)
=IF(TODAY() > C2;TODAY() - C2; 0)
Result: 1515
Step by step
- Excel evaluates the test of IF first. TODAY() returns 46295 and
C2holds 15 September 2026, serial number 46280. The test 46295 > 46280 is TRUE. - Because the test is TRUE, IF evaluates the second argument: 46295 - 46280 = 15 days overdue.
- Copied to
D3, the due date is 14 October 2026 (46309). 46295 > 46309 is FALSE, so IF returns 0. Without IF,D3would show -14. D4: the due date is today, 46295 > 46295 is FALSE, so 0. An invoice is not late on its due date.D5: 2 July 2026 is 46205, so 46295 - 46205 = 90 days.D6: 14 August 2026 is 46248, so 46295 - 46248 = 47 days.- Your own results will be higher, because TODAY() returns the date on which you open the sheet. Every overdue row moves up by 1 each day.
Watch out: An empty due date is read as 0, so the test is TRUE and the row shows 46295 days overdue. This happens when the ledger export has invoices without a due date. Filter those rows out, or test for a blank first.
More on this example: why it works, 1 variation
Why it works
The comparison decides whether an invoice is late at all, and only then is the subtraction used. TODAY() needs no $ signs when the formula is copied down, because it is a function and not a cell reference; only C2 moves with each row.
Variations
=MAX(0,TODAY() - C2)
=MAX(0;TODAY() - C2)
The same result with MAX as a floor: shorter, and TODAY() is called once instead of twice.
AdvancedExcel 2021 or later (This example needs Excel 2021 or later)
Loans that mature within the next 30 days
The client's loan register lists each loan with its maturity date. For the going concern and classification work you want a live list of the loans that mature between today and the number of days in F1, so you can check the repayment plan and the split between current and non-current liabilities.
Loans that have already matured belong on a different list. The example assumes today is 30 September 2026.
| Row | A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|---|
| 1 | Loan | Type | Maturity date | Window (days) | 3030 | ||
| 2 | LN-01 | Term loan | 5 Oct 2026 | ||||
| 3 | LN-02 | Mortgage | 31 Mar 2027 | Maturing | LN-01=FILTER(A2:A7, (C2:C7 >= TODAY()) * (C2:C7 <= TODAY() + F1), "None")=FILTER(A2:A7; (C2:C7 >= TODAY()) * (C2:C7 <= TODAY() + F1); "None") | ||
| 4 | LN-03 | Car lease | 29 Sep 2026 | LN-04 | |||
| 5 | LN-04 | Credit facility | 30 Oct 2026 | LN-06 | |||
| 6 | LN-05 | Equipment loan | 2 Nov 2026 | ||||
| 7 | LN-06 | Shareholder loan | 30 Sep 2026 | ||||
| 8 |
Swipe sideways to see all columns
Formula in F3
=FILTER(A2:A7,(C2:C7 >= TODAY()) * (C2:C7 <= TODAY() + F1), "None")
=FILTER(A2:A7;(C2:C7 >= TODAY()) * (C2:C7 <= TODAY() + F1); "None")
Result: LN-01 / LN-04 / LN-06LN-01 / LN-04 / LN-06
Step by step
- Excel evaluates the inner parts first. TODAY() returns 46295, and TODAY() +
F1= 46295 + 30 = 46325, which is 30 October 2026. The first test compares each maturity date with 46295:
LN-01(46300): TRUELN-02(46477): TRUELN-03(46294): FALSE (it matured yesterday)LN-04(46325): TRUELN-05(46328): TRUELN-06(46295): TRUE (it matures today)
The second test compares each maturity date with 46325:
LN-01: TRUELN-02: FALSELN-03: TRUELN-04: TRUE (exactly day 30)LN-05: FALSE (46328)LN-06: TRUE
- Multiplying the two arrays works as AND: TRUE × TRUE is 1, anything with FALSE is 0. The include array becomes 1, 0, 0, 1, 0, 1.
- FILTER keeps the rows of
A2:A7where that array is 1 and spillsLN-01,LN-04andLN-06intoF3:F5. If no row qualified, it would return None. - Next Monday, 5 October 2026,
LN-06drops off,LN-01is still listed on its last day, andLN-05comes in. Your list depends on the day you open the sheet.
Watch out: Writing > TODAY() instead of >= TODAY() silently drops the loan that matures today, LN-06, which is the one most urgently in need of attention.
More on this example: why it works, 1 more pitfall, 1 variation
Why it works
Two comparisons against TODAY() define a moving window, and multiplying them keeps only rows inside both bounds. Because the window is recalculated on every open, the list maintains itself; no one has to edit dates in the formula.
More to watch out for
- If the maturity dates carry a time (for example 30 October 2026 12:00), the upper test fails for that last day, because 46325.5 is greater than 46325.
Variations
=COUNTIFS(C2:C7,">=" & TODAY(), C2:C7, "<=" & TODAY() + F1)
=COUNTIFS(C2:C7;">=" & TODAY(); C2:C7; "<=" & TODAY() + F1)
Only the number of maturing loans (3), for a summary line in your working paper, and it works in versions without FILTER.
MasterExcel 2021 or later (This example needs Excel 2021 or later)
Completed years since acquisition, correct on the anniversary
You are recalculating depreciation from the fixed asset register and first need the number of completed years since each asset was bought. Subtracting years gives one year too many for every asset whose anniversary is later this year, and the count must be right on the anniversary itself. The formula should call TODAY once and read clearly for the next person on the file. The example assumes today is 30 September 2026.
| Row | A | B | C | D |
|---|---|---|---|---|
| 1 | Asset | Purchase date | Completed years | |
| 2 | Delivery van | 1 Oct 2019 | 66=LET( asOf, TODAY(), bought, B2, years, YEAR(asOf) - YEAR(bought), reached, DATE(YEAR(asOf), MONTH(bought), DAY(bought)) <= asOf, IF(reached, years, years - 1) )=LET( asOf; TODAY(); bought; B2; years; YEAR(asOf) - YEAR(bought); reached; DATE(YEAR(asOf); MONTH(bought); DAY(bought)) <= asOf; IF(reached; years; years - 1) ) | |
| 3 | Forklift | 30 Sep 2019 | ||
| 4 | Server rack | 15 Mar 2021 | ||
| 5 | Warehouse shelving | 15 Oct 2010 | ||
| 6 | Laser cutter | 29 Feb 2016 | ||
| 7 |
Swipe sideways to see all columns
Formula in C2
=LET( asOf,TODAY(), bought, B2, years, YEAR(asOf) - YEAR(bought), reached, DATE(YEAR(asOf), MONTH(bought), DAY(bought)) <= asOf, IF(reached, years, years - 1) )
=LET( asOf;TODAY(); bought; B2; years; YEAR(asOf) - YEAR(bought); reached; DATE(YEAR(asOf); MONTH(bought); DAY(bought)) <= asOf; IF(reached; years; years - 1) )
Result: 66
Step by step
- LET evaluates TODAY() once and stores it as asOf: 46295, 30 September 2026. bought is
B2, 1 October 2019. - years is the plain difference of the calendar years: 2026 - 2019 = 7. That is the number the naive formula would show.
- reached builds this year's anniversary: DATE(2026, 10, 1), 1 October 2026. It then tests 1 October 2026 <= 30 September 2026, which is FALSE: the anniversary is tomorrow.
- The last argument decides: reached is FALSE, so the result is years - 1 = 6 completed years. Tomorrow the same cell shows 7.
- Forklift, bought 30 September 2019, reaches its anniversary today: DATE(2026, 9, 30) <= asOf is TRUE, so 7. Warehouse shelving: 2026 - 2010 = 16, anniversary 15 October not reached, so 15.
- The laser cutter was bought on 29 February 2016. DATE(2026, 2, 29) rolls over to 1 March 2026, which has passed, so 2026 - 2016 = 10. In non-leap years its anniversary counts from 1 March.
Watch out: The mirror-image mistake is testing reached with < instead of <=. It looks the same, but on the anniversary itself the forklift shows 6 instead of 7, exactly on the day the count changes.
More on this example: why it works, 1 more pitfall, 1 variation
Why it works
The count of years is only complete once this year's anniversary has arrived, and DATE rebuilds that anniversary from today's year and the purchase month and day. LET evaluates TODAY once, so every part of the formula uses the same date.
DATEDIF with unit Y gives the same answer in one call, but Excel itself does not list it in the Insert Function dialog or suggest it while you type, so you get no tooltip for its arguments.
Do not use TODAY here when the figures belong to a fixed moment, such as the balance sheet date of 31 December 2025: replace TODAY() in the formula with a reference to a cell that holds that date, so the numbers stay as they were when you signed them off.
More to watch out for
- YEAR(TODAY()) - YEAR(B2) on its own is right from the anniversary until 31 December and one year too high before it, so it passes a test run in December and fails in September.
Variations
=YEAR(TODAY()) - YEAR(B2) - (DATE(YEAR(TODAY()),MONTH(B2), DAY(B2)) > TODAY())
=YEAR(TODAY()) - YEAR(B2) - (DATE(YEAR(TODAY());MONTH(B2); DAY(B2)) > TODAY())
The same logic without LET: TRUE counts as 1 in the subtraction. It works, but calls TODAY three times and is harder to read.
Common mistakes
| Symptom | Cause | Fix |
|---|---|---|
| Old day counts in an old report | A report built last month still shows the old day counts, because someone copied the TODAY cell and pasted it as values. | Check the formula bar: a live cell shows =TODAY(), a frozen one shows a date. Retype the formula, and keep it out of ranges you paste as values. |
| The date never changes | Ctrl+; was used to enter the date, expecting it to update. It never changes. | Ctrl+; types today's date as a constant, which is right for a date stamp. Use =TODAY() when the value must move with the calendar. |
| An entry from today counts as the future | Comparing a date and time value with TODAY(): an entry at 14:00 today is greater than TODAY(), so it counts as 'in the future'. | TODAY() is midnight at the start of the day. Compare with TODAY() + 1 for 'before tomorrow', or use NOW for time-sensitive checks. |
| The workbook is slow after every edit | A large workbook with thousands of TODAY() calls feels slow on every edit. | Put =TODAY() once in a cell (or a named cell) and refer to it everywhere. Every formula that depends on a volatile function recalculates with it. |