Сегодня, ввиду особенности разработки одной из CRM-систем, над которой мне довелось работать, стала задача в построении графика с суточной, недельной или месячной группировкой. Не вдаваясь в подробности скажу лишь, что решение довелось искать изощренное, ввиду большой специфики пересчета конечных данных.
В итоге я решил попробовать копнуть в сторону уникального запроса, т.к. мне, по сути, требовались лишь id записей, которые попадают в диапазон, а также даты начала и конца этого диапазона.
В итоге вышел вот такой запрос:
SELECT GROUP_CONCAT( id ) as ids, TIMESTAMPADD( DAY, -WEEKDAY(date_created) ,DATE(date_created) as 'start_week', TIMESTAMPADD( DAY, 6-WEEKDAY(date_created), DATE(date_created) ) as 'end_week' FROM orders WHERE id > 0 GROUP BY WEEK( date_created, 1 ) ORDER BY date_created ASC
Запрос вернет дату начала и конца недели в разных полях.
Чтобы вернуть данные в одном поле — следует еще немного усложнить запрос и заменить выборку TIMESTAMPADD на следующие строки:
CONCAT( DATE_FORMAT( TIMESTAMPADD( DAY, -WEEKDAY(date_created) ,DATE(date_created) ), "%d.%m" ) , "-", DATE_FORMAT( TIMESTAMPADD( DAY, 6-WEEKDAY(date_created), DATE(date_created) ), "%d.%m" ) )
Эта модификация вернет даты начала и конца недели в одну строку с разделителем в виде дефиса.