ДЕМО: показаны 3 подхода и почему ток не работает.
Если мы предположим, что под «прошлой неделей» подразумевается последняя полная неделя с понедельника по воскресенье недели, предшествующей дню, на котором вы в настоящее время находитесь ...
Так что, если сегодня был 20180422, вы бы хотели 20180409-20180415
SELECT *
FROM SO50026532_sport_data
CROSS JOIN (SELECT @Today:=curdate()) z
WHERE date >= @today - interval (6 + case when dayofweek(@today)=1 then 7 else dayofWeek(@today)-1 end) day
and date <=@today - interval (case when dayofweek(@today)=1 then 7 else dayofWeek(@today)-1 end) day;
Или если вы поклонник> = и <тогда </p>
SELECT *
FROM SO50026532_sport_data
CROSS JOIN (SELECT @Today:=curdate()) z
WHERE date >= @today - interval (6 + case when dayofweek(@today)=1 then 7 else dayofWeek(@today)-1 end) day
and date <@today - interval (case when dayofweek(@today)=1 then 7 else dayofWeek(@today)-1 end-1) day;
во втором примере мы должны были вычесть на 1, так как dayofweek не основан на 0. Конечно, я мог бы просто сместить дату на 2 и установить воскресенье на 6 ... тогда мне не нужно было бы вычитать на 1. и тогда мы добавили бы 7 вместо 6 в 1-ю часть где. (демо содержит эти 3 и ваш первоначальный пример, показывающий, что происходит 4/22.
Dayofweek начинается в воскресенье с 1, поэтому я использую инструкцию case, чтобы сместить 1 на 7, а все остальные - на 1, что дает понедельник = 1 и воскресенье = 7
Перекрестное соединение с производной таблицей z было таким, чтобы я мог легче контролировать curdate () и тестировать. Вы можете заменить переменную curdate (), если хотите, и устранить перекрестное соединение и производную таблицу.
Первое условие where вычитает 6 дней (1 неделя, а затем количество дней с текущей даты до понедельника. Это гарантирует, что мы всегда начинаем с 1 недели с текущей даты и с понедельника. Затем мы получаем только даты до воскресенья этой недели.