Esta função deve fazer o que você deseja. Ele se baseia no MySQL tratando os resultados booleanos como 1 ou 0 em um contexto numérico, portanto, o
MAX
chamada efetivamente se torna um OR
de todas as condições. CREATE FUNCTION check_activity(project_id INT, check_date DATE)
RETURNS BOOLEAN
DETERMINISTIC
BEGIN
RETURN (SELECT MAX(check_date BETWEEN ActiveFrom AND ActiveTo) FROM projects WHERE ProjId = project_id);
END
SELECT check_activity(20, '2018-01-10'), check_activity(20, '2018-02-01')
Resultado
check_activity(20, '2018-01-10') check_activity(20, '2018-02-01')
1 0
Demonstração no dbfiddle