SharePoint Alfresco PHP MySQL
О сайте Контакты
четверг, 2 апреля 2015 г.

Как в MySQL вывести список дат заданного диапазона?

Допустим, есть таблица с событиями, которые наступили в определенную дату. Нужно выяснить, сколько событий было за каждый день из заданного интервала?

Можно решить эту задачу на языках программирования, также можно на MySQL с помощью процедур. Но можно обойтись и вовсе без программирования, просто составив нужный запрос. В центре этого запроса должен фигурировать список дат, чтобы MySQL вывел их и дал с ними работать. Короткой функции для этого нет, зато можно получить результат с помощью такого немного длинного запроса:

SELECT time_period.selected_date AS `Текущая дата` FROM
(SELECT v.* FROM 
  (SELECT ADDDATE('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date FROM
   (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
   (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
   (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
   (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
   (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4) v
  WHERE selected_date BETWEEN '2015-01-01' AND '2015-03-31') AS time_period

Суть его в том, что выбираются разряды чисел: единицы, десятки, сотни, тысячи, десятки тысяч. Эти числа комбинируются между собой и образуют ряд от 0 до 99999. Каждое число этого ряда прибавляется в виде дня к дате начала времен ('1970-01-01') и выводится. В качестве фильтра, чтобы не выводилось совсем всё, используется WHERE вместе с BETWEEN.

В общем, после выполнения запроса выведутся все даты заданного диапазона. Далее их можно использовать для включения в конструкцию LEFT JOIN, и после группировки получить искомое число событий в заданный день (при желании не только день, но и месяц или другой период).

Sergey Lysenko, четверг, 2 апреля 2015 г.

Комментарии: