DATE_FORMAT()
devuelve una cadena, no una fecha. Pasar 3 argumentos de cadena a BETWEEN
... quién sabe qué va a devolver eso.
Para descifrar su código, utilice:
$week_start = date('Y-m-d',time()+( 1 - date('w'))*24*3600);
$week_end = date('Y-m-d',time()+( 7 - date('w'))*24*3600);
para formatear sus fechas de la forma en que mySQL espera, y:
WHERE
start_date BETWEEN '".$week_start."' AND '".$week_end."'
en la consulta.
O si prefiere un enfoque orientado a objetos, haga algo como esto:
$week_start = new DateTime;
$week_end = new DateTime;
$week_start->setTimestamp(time()+( 1 - date('w'))*24*3600));
$week_end->setTimestamp(time()+( 7 - date('w'))*24*3600);
Luego, en su consulta haga:
WHERE
start_date
BETWEEN '".$week_start->format('Y-m-d')."'
AND '".$week_end->format('Y-m-d')."'
Luego, para todo lo demás, puede repetir el formato como desee:
echo $date->format('d-m-Y'); // etc