Question 1easy#Airflow#Orchestration
What is the data interval in Airflow? A new daily Dag with start_date set to today did not run today, and a colleague asks how to load the last 30 days it missed.
Say your answer out loud first, the way you would in the room.
In shortAirflow schedules a run for a period of data, the data interval, and starts it after the period has ended, so the run can see all of that period's data.
Airflow schedules a run for a period of data, the data interval, and starts it after the period has ended, so the run can see all of that period's data. A @daily run for 1 January starts just after midnight on 2 January. The first interval begins at start_date, so a Dag with start_date today has its first run tomorrow, covering today. The run's logical date is the start of its interval, not the moment it ran. For the 30 missed days, run a backfill over those dates rather than turning catchup on.
1. One daily run, step by step
| Value | |
|---|---|
| Schedule | @daily |
| Data interval | 2026-01-01 00:00 to 2026-01-02 00:00 |
| Logical date | 2026-01-01 00:00 |
| Starts | Just after 2026-01-02 00:00 |
Inside a task, the interval is data_interval_start and data_interval_end, and those, not today's clock, say which day to load.
2. Why the new Dag waited
from airflow.sdk import DAG
import pendulum
with DAG(
dag_id="daily_orders",
schedule="@daily",
start_date=pendulum.datetime(2026, 10, 16, tz="UTC"),
catchup=False,
):
...
The first interval is 16 October. Its run starts after it ends, on 17 October. Nothing was wrong.
3. Catchup and backfill
- Catchup (
catchup=True) makes the scheduler create a run for every interval sincestart_datethat has not run. It is off by default, and it should stay off for a Dag that is not written to load only its own interval. - Backfill runs a chosen range once, on purpose:
airflow backfill create --dag-id daily_orders \
--from-date 2026-09-16 --to-date 2026-10-15 \
--max-active-runs 3 \
--reprocess-behavior failed
--max-active-runs keeps 30 runs from hitting the source at once, and --reprocess-behavior says what to do with intervals that already ran (here, rerun only the failed ones).
4. What makes a backfill safe
Each run must load exactly its own interval and overwrite it, so running 30 old days gives 30 correct days, and running one twice changes nothing. See idempotent pipelines.
What interviewers want: a run covers an interval and starts after it ends, the first run one interval after start_date, logical date as the interval's start, catchup off by default, backfill for a chosen range with a limit on parallel runs, and tasks that load their own interval.