# Efficient date range overlap calculation?

## Issue

I have two date ranges where each range is determined by a start and end date (obviously, `datetime.date` instances). The two ranges can overlap or not. I need the number of days of the overlap. Of course I can pre-fill two sets with all dates within both ranges and the perform a set intersection but this is possibly inefficient…is there a better way apart from another solution using a long `if``elif` section covering all cases?

## Solution

• Determine the latest of the two start dates and the earliest of the two end dates.
• Compute the timedelta by subtracting them.
• If the delta is positive, that is the number of days of overlap.

Here is an example calculation:

``````>>> from datetime import datetime
>>> from collections import namedtuple
>>> Range = namedtuple('Range', ['start', 'end'])

>>> r1 = Range(start=datetime(2012, 1, 15), end=datetime(2012, 5, 10))
>>> r2 = Range(start=datetime(2012, 3, 20), end=datetime(2012, 9, 15))
>>> latest_start = max(r1.start, r2.start)
>>> earliest_end = min(r1.end, r2.end)
>>> delta = (earliest_end - latest_start).days + 1
>>> overlap = max(0, delta)
>>> overlap
52
``````