Você poderia tentar isso:
FROM workdone
LEFT JOIN staffcost ON workdone.date >= MAKEDATE(staffcost.costyear, 1)
AND workdone.date < MAKEDATE(staffcost.costyear+1, 1)
Isso permitirá o uso de um índice em
workdone.date para pesquisar datas entre o primeiro dia do costyear até, mas não incluindo o primeiro dia de costyear+1 . Em geral, esse tipo de pesquisa de intervalo pode explorar índices onde funções (como
YEAR(datestamp) ) não pode.