MySQL. Как вывести даты начала и конца недели при недельной группировке?


Сегодня, ввиду особенности разработки одной из 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" ) 
) 

Эта модификация вернет даты начала и конца недели в одну строку с разделителем в виде дефиса.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *