MYSQL: получение всех результатов за последнюю неделю, начиная с понедельника) - PullRequest
0 голосов
/ 25 апреля 2018
CREATE TABLE `sport_data` (
      `id` int(255) NOT NULL,
      `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `sport` varchar(255) NOT NULL,
      `musclePlan` varchar(255) NOT NULL,
      `sport_time` varchar(255) NOT NULL,
      `kcal` varchar(255) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Как я могу получить все данные из этой таблицы за последнюю неделю (с понедельника по воскресенье)?

Я пытался:

WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+5 DAY AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-2 DAY

Я не знаюесли это так?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

ДЕМО: показаны 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 недели с текущей даты и с понедельника. Затем мы получаем только даты до воскресенья этой недели.

0 голосов
/ 25 апреля 2018

Шаблон >= и < - это то, что мы обычно используем.Эта часть выглядит правильно.

Я думаю, что вопрос о выражениях , которые возвращают начальные и конечные значения диапазона.

Я предлагаю протестировать эти выражения для множествазначений даты, а не только CURDATE().Мы можем использовать значение вместо CURDATE(), проверить результаты и сделать это для серии значений даты.

Удобно, чтобы эти выражения оценивались в списке SELECT так же, как и они.в предложении WHERE.Таким образом, мы можем запустить оператор SELECT и проверить результаты.

Например:

SELECT t.dt                                      AS dt
     , t.dt - INTERVAL DAYOFWEEK(t.dt)+5 DAY     AS _ge
     , t.dt - INTERVAL DAYOFWEEK(t.dt)-2 DAY     AS _lt
  FROM (
         SELECT CURDATE() + INTERVAL 0 DAY AS dt
         UNION ALL SELECT CURDATE() + INTERVAL -1 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -2 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -3 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -4 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -5 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -6 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -7 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -8 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -9 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -10 DAY
       ) t

Если выражения возвращают ожидаемые нами значения в соответствии со спецификацией длякаждое возможное значение даты, то выражения правильные.

Если выражения возвращают значения, которые не соответствуют спецификации, то нам нужно внести коррективы.Обратите внимание, что выражение, которое «работает» в среду, может не работать в воскресенье.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...