Você precisa distinguir dois casos.
-
Quandofirst < last
, as datas são no mesmo ano. Você pode então usarbetween
para 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)