Find Events between Dates
What about using BETWEEN by taking the first and last month of the ranges:

SELECT *
FROM `table` `t`
WHERE 
  '2018-01-01' BETWEEN
     DATE_FORMAT(start_date ,'%Y-%m-01') AND
     LAST_DAY(end_date)


As this won't use indexes an alternate is to use generated columns:

ALTER TABLE `table`
ADD start_month DATE GENERATED ALWAYS AS (DATE_FORMAT(start_date ,'%Y-%m-01')),
ADD end_month DATE GENERATED ALWAYS AS (LAST_DATE(end_date)),
ADD INDEX start_end_month(start_month,end_month)


Then the query will become the following and use the start_end_month index:

SELECT *
FROM `table` `t`
WHERE 
  '2018-01-01' BETWEEN
     start_month AND end_month