Você precisa distinguir dois casos.
-
Quandofirst < last, as datas são no mesmo ano. Você pode então usarbetweenpara coincidir com as datas.
-
Quandofirst > last, significalasté no próximo ano. Nesse caso, as datas correspondentes sãodate >= first OR date <= last.
Portanto, sua cláusula WHERE deve ser:
WHERE IF(first < last, @date BETWEEN first AND last,
@date >= first OR date <= last)