### Body

Currently `start_date` is mandatory parameter.
For DAGs with `schedule=None` we can relax this requirement as no scheduling calculation needed so the `start_date` parameter isn't used.

### Committer

- [X] I acknowledge that I am a maintainer/committer of the Apache Airflow project.
self,
        base_date: datetime,
        num: int,
        *,
        session: Session = NEW_SESSION,
    ) -> list[TaskInstance]:
        """Get ``num`` task instances before (including) ``base_date``.
        The returned list may contain exactly ``num`` task instances
        corresponding to any DagRunType. It can have less if there are
        less than ``num`` scheduled DAG runs before ``base_date``.
        """
        execution_dates: list[Any] = session.execute(
            select(DagRun.execution_date)
            .where(
                DagRun.dag_id == self.dag_id,
                DagRun.execution_date <= base_date,
            )
            .order_by(DagRun.execution_date.desc())
            .limit(num)
        ).all()
        if not execution_dates:
            return self.get_task_instances(start_date=base_date, end_date=base_date, session=session)
        min_date: datetime | None = execution_dates[-1]._mapping.get(
            "execution_date"
        )  
        return self.get_task_instances(start_date=min_date, end_date=base_date, session=session)
    @provide_session
    def get_task_instances(