Недавно я боролся с той же проблемой и пришел к концу с этим простым шагом (это может быть не очень хороший подход или потребление памяти) -
SELECT * FROM duty_register WHERE employee = '2' AND (
(
duty_start_date BETWEEN {$start_date} AND {$end_date}
OR
duty_end_date BETWEEN {$start_date} AND {$end_date}
)
OR
(
{$start_date} BETWEEN duty_start_date AND duty_end_date
OR
{$end_date} BETWEEN duty_start_date AND duty_end_date)
);
Это помогло мне найти записи с перекрывающиеся диапазоны дат.
Надеюсь, это кому-то поможет.