Hola,
¿Que motor de base de datos usas? Porque la sintaxis SQL varia de uno a otro. Por ejemplo, en MySQL tienes las funciones ADDDATE y DATE_ADD (
http://dev.mysql.com/doc/mysql/en/Da...functions.html), con sintaxis distintas a la tuya. Tambien puede cambiar la forma de expresar las cadenas de fechas, y los formatos.
De todas formas, creo que es mejor
SELECT *,ADDDATE(fecha, INTERVAL 21 DAY) as fecha_futura FROM tabla WHERE fecha_futura BETWEEN '$fecha_inicio' AND '$fecha_final'
si tu base de datos es MySQL. Y fecha_inicio y fecha_final deben estar en el formato AAAA-MM-DD.
Saludos.