Excel EDATE Function
EDATE returns the date a set number of months before or after a given start date.
EDATE returns the date that falls a specific number of months before or after a date you give it. Feed it a start date and a number of months, and it hands back a new date on (or as close as possible to) the same day of the month. The number can be negative, so EDATE both adds and subtracts. One thing that trips up beginners immediately: the result often displays as a plain number like 46215 instead of a date, until you format the cell.
Available in: Excel 365, Excel 2021, Excel 2019, Excel 2016, and Excel Online.
Syntax
=EDATE(start_date, months)
| Parameter | Required | Description |
|---|---|---|
start_date | Yes | The date to calculate from. Can be a cell reference, a date typed in quotes that Excel recognizes, or a function like TODAY(). |
months | Yes | How many months to add. Use a positive number to move forward, a negative number to move backward. Decimals are truncated, not rounded. |
Basic Example
You're tracking software license renewals. Each license starts on a specific date and renews every 12 months.
=EDATE(B2, 12)
// B2 = the license start date
// 12 = number of months to add
If B2 contains June 3, 2026, this formula returns June 3, 2027. Format the cell as a date if it shows a raw number instead. Change the 12 to -12 and you'd get the renewal date one year earlier instead.
How EDATE Works
EDATE keeps the same day of month, with one exception
EDATE tries to land on the same day in the target month. The exception is when that day doesn't exist. =EDATE("31-Jan-2026", 1) doesn't return February 31. It rolls back to February 28, 2026, the last valid day of that month. This is the single most common source of "wrong" EDATE results, and it isn't a bug. It's Excel choosing the nearest valid date instead of throwing an error.
Negative numbers subtract months
Pass a negative number and EDATE counts backward. =EDATE("15-Jul-2026", -3) returns April 15, 2026. This is how most rolling-window reports pull a start date: subtract from today instead of adding to a fixed date.
EDATE returns a serial number, not a formatted date
The formula bar shows a date-looking value if the cell is already formatted as a date. If it isn't, EDATE displays a plain integer. Select the cell, open Format Cells, and choose a date format. This one behavior accounts for a large share of "EDATE isn't working" confusion, because the formula is actually correct.
Fractional months are truncated, not rounded
=EDATE(A2, 6.9) behaves exactly like =EDATE(A2, 6). EDATE drops everything after the decimal point instead of rounding up. Don't expect 6.9 to behave like 7.
Time values in the start date are dropped
If start_date includes a time component, such as 7/15/2026 3:00 PM, EDATE strips the time and works only with the date portion. The returned value has no time attached, even if the original cell did.
Common Use Cases
Calculate a subscription or contract renewal date
A customer signs up on a specific date and renews annually.
=EDATE(C2, 12) // returns the renewal date one year after signup
Build a rolling reporting window
Pull every order from the last 3 months without hardcoding a date.
=EDATE(TODAY(), -3)
// TODAY() = the current date, recalculates daily
// -3 = go back three months
Use this as the lower bound in a COUNTIFS or SUMIFS formula, and the window shifts automatically each time the sheet opens. No need to update it monthly.
Flag overdue equipment warranties
A warranty runs 18 months from the purchase date. Compare the expiration to today and flag anything already expired.
=IF(EDATE(D2, 18) < TODAY(), "Expired", "Active")
Add years to a date using months
EDATE has no year argument, but a year is just 12 months.
=EDATE(E2, 5*12) // adds exactly 5 years to the date in E2
Multiplying by 12 is more readable than typing 60 directly, especially when the year count comes from another cell.
Handling Errors
EDATE throws #VALUE! when it can't interpret one of its arguments as a valid date or number. This is the only error EDATE returns, and it's catchable.
Common causes of #VALUE!:
start_dateis text Excel doesn't recognize as a date, like "July 2026" without a daystart_datepoints to a blank cellmonthscontains text instead of a number
=IFERROR(EDATE(F2, G2), "Check date and month values")
If EDATE is fed by user input, wrap it in a data validation rule that restricts the source cell to dates. That prevents the #VALUE! error before it happens, rather than catching it after.
Notes & Gotchas
Why does EDATE return #VALUE!?
The most common cause is a start_date that Excel doesn't recognize as a real date, such as a date typed with an ambiguous or unsupported format. Text stored as a date-looking string ("Jan-2026" with no day, for instance) will trigger this. Check that the cell actually contains a date by confirming it's right-aligned; text values left-align by default.
Why does EDATE show a number instead of a date?
EDATE always returns a serial number. Excel only displays it as a readable date if the cell has a date format applied. Select the result cell and format it as a short date, and the number resolves into a normal calendar date.
What happens when you add a month to January 31?
EDATE returns February 28 (or February 29 in a leap year), not March 3. When the target month has fewer days than the start day, EDATE lands on the last day of that month instead of rolling into the next one. This matters for billing cycles anchored on the 29th, 30th, or 31st.
Does EDATE account for leap years automatically?
Yes. =EDATE("29-Feb-2024", 12) returns February 28, 2025, because 2025 isn't a leap year and has no February 29. EDATE checks the actual calendar for the target year, not a fixed 365-day assumption.
How is EDATE different from EOMONTH?
EDATE returns a date on the same day of the month, shifted by a number of months. EOMONTH ignores the day entirely and always returns the last day of the target month. Use EDATE when the day matters, like a recurring billing date. Use EOMONTH when you need month boundaries, like the last day of the current quarter.
Related Functions
| Function | Use this when... |
|---|---|
DATE | You're building a date from separate year, month, and day values instead of shifting an existing one. |
DATEDIF | You need the difference between two dates in years, months, or days, rather than a new date. |
Related Functions
Excel DATE Function
DATE turns three separate numbers into one date Excel can calculate with. It's the function that makes dynamic date-building possible.
Excel DAYS Function
DAYS subtracts one date from another and hands you a clean number, no formatting cleanup required. Get the argument order backward and you'll get a negative result with no warning.
Excel WEEKDAY Function
WEEKDAY turns any date into a number representing the day of the week, which makes it the building block for weekend flags, workday counts, and Monday-of-week formulas. The default numbering starts the week on Sunday, which trips up a lot of Monday-based schedules.
Excel AND Function
AND is the logical glue behind most multi-condition IF formulas. Learn how it evaluates conditions, where it silently breaks, and when to pair it with OR instead.