Es necesario distinguir dos casos.
-
Cuando
first < last, las fechas son del mismo año. A continuación, puede utilizarbetweenpara hacer coincidir las fechas. -
Cuando
first > last, significalastes en el proximo año. En este caso, las fechas que coinciden sondate >= first OR date <= last.
Entonces su cláusula WHERE debería ser:
WHERE IF(first < last, @date BETWEEN first AND last,
@date >= first OR date <= last)