### 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.
} == set(session.query(DagTag.dag_id, DagTag.name).all())
            for row in session.query(DagModel.last_parsed_time).all():
                assert row[0] is not None
        
        for dag in dags:
            dag.tags = None
        with assert_queries_count(9):
            DAG.bulk_write_to_db(dags)
        with create_session() as session:
            assert {"dag-bulk-sync-0", "dag-bulk-sync-1", "dag-bulk-sync-2", "dag-bulk-sync-3"} == {
                row[0] for row in session.query(DagModel.dag_id).all()
            }
            assert not set(session.query(DagTag.dag_id, DagTag.name).all())
            for row in session.query(DagModel.last_parsed_time).all():
                assert row[0] is not None
    @pytest.mark.parametrize("interval", [None, "@daily"])
    def test_bulk_write_to_db_interval_save_runtime(self, interval):
        mock_active_runs_of_dags = mock.MagicMock(side_effect=DagRun.active_runs_of_dags)
        with mock.patch.object(DagRun, "active_runs_of_dags", mock_active_runs_of_dags):
            dags_null_timetable = [
                DAG("dag-interval-None", schedule_interval=None),
                DAG("dag-interval-test", schedule_interval=interval),
            ]
            DAG.bulk_write_to_db(dags_null_timetable, session=settings.Session())
            if interval:
                mock_active_runs_of_dags.assert_called_once()
            else:
                mock_active_runs_of_dags.assert_not_called()
    @pytest.mark.parametrize("state", [DagRunState.RUNNING, DagRunState.QUEUED])
    def test_bulk_write_to_db_max_active_runs(self, state):