Я совершенно новичок, и я не мог найти хороший способ сделать это где-нибудь. У меня есть таблица базы данных, которая содержит статистику, которая записывается в разное время в течение недели. Отчетная неделя начинается в четверг. Таблица содержит столбец с датой (дата), в котором хранятся данные, когда они были записаны.
Мне нужно получить данные за данную неделю (отчетные недели начинаются в четверг). Я написал следующий запрос:
SELECT *
FROM `table`
WHERE 1 = CASE
WHEN WEEKDAY(NOW()) = 0 THEN DATEDIFF(NOW(),`date`) BETWEEN -2 AND 4
WHEN WEEKDAY(NOW()) = 1 THEN DATEDIFF(NOW(),`date`) BETWEEN -1 AND 5
WHEN WEEKDAY(NOW()) = 2 THEN DATEDIFF(NOW(),`date`) BETWEEN -0 AND 6
WHEN WEEKDAY(NOW()) = 3 THEN DATEDIFF(NOW(),`date`) BETWEEN -6 AND 0
WHEN WEEKDAY(NOW()) = 4 THEN DATEDIFF(NOW(),`date`) BETWEEN -5 AND 1
WHEN WEEKDAY(NOW()) = 5 THEN DATEDIFF(NOW(),`date`) BETWEEN -4 AND 2
WHEN WEEKDAY(NOW()) = 6 THEN DATEDIFF(NOW(),`date`) BETWEEN -3 AND 3
END
Похоже, это работает на начальном тестировании. Но я не уверен, что это лучший способ сделать это. Я не знаю много о производительности MySQL, но там будет более ста тысяч записей для фильтрации. Будет ли этот запрос очень медленным из-за количества проверенных условий?
Функция NOW () используется при извлечении самого последнего отчета - однако в некоторых случаях мне нужно будет делать отчеты за другие недели - поэтому я бы подставил другую дату на место.
Кроме того, для этого необходимо переписать запрос, если отчетная неделя изменится - скажем, начальный день изменится на среду.
Я не могу использовать функцию WEEK (), потому что вы можете начать с нее только неделю или воскресенье.
Любые идеи по улучшению этого запроса очень ценятся!
Другие примечания: В настоящее время используется MariaDB 5.3.