Задать вопрос
frost18
@frost18
Программист PHP

Как правильно составить запрос по выбору дней из диапазона дат?

В таблице хранятся дела, у которых есть дата начала и дата окончания (тип поля DATETIME).

id | date_from | date-_to
------------------------------------------------------------
1 | 2015-11-02 00:00:00 | 2015-11-02 23:59:59
2 | 2015-11-02 09:00:00 | 2015-11-02 18:00:00
3 | 2015-11-02 00:00:00 | 2015-12-01 23:59:59
4 | 2016-01-01 00:00:00 | 2016-01-01 23:59:59

Мне нужно вывести дни в которые эти задачи актуальны
SELECT *, DATE_FORMAT(date_from, '%m-%d-%Y') AS date_from_date FROM `task` GROUP BY date_from_date

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

В результате мне нужно получить даты(дни) в которые актуальны задачи.
В данном примере запрос должен выдать:
2015-11-02
2015-11-03
2015-11-04
2015-11-05
...
2015-12-01
2016-01-01
  • Вопрос задан
  • 187 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
frost18
@frost18 Автор вопроса
Программист PHP
SELECT DATE_ADD(date_from, INTERVAL rn DAY) AS `date`
FROM task
INNER JOIN (
  SELECT @rn := @rn + 1 AS rn
  FROM (
    SELECT *
    FROM (
      SELECT 1 AS n1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
      SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
      SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
    ) AS t1 CROSS JOIN (
      SELECT 1 AS n2 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
      SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
      SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
    ) AS t2
  ) AS t CROSS JOIN (SELECT @rn := -1) AS var   
) AS tally ON DATEDIFF(date_to, date_from) >= rn
ORDER BY `date`
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
R0dger
@R0dger
Laravel/Yii/2 AngularJs PHP RESTful API
Используем поиск от Google
Ответ написан
Комментировать
@nozzy
Symfony, Laravel, SQL, Python, Telegram
SELECT
GROUP_CONCAT (id),
DATE_FORMAT(date_from, '%m-%d-%Y') AS date_from_date,
DATE_FORMAT(date_to, '%m-%d-%Y') AS date_to_date
FROM `task`
GROUP BY DATE_FORMAT(date_from, '%m-%d-%Y') ,
DATE_FORMAT(date_to, '%m-%d-%Y')
Ответ написан
@postgree
Что вы хотите получить? строку с датами для каждой задачи? тогда:
DELIMITER $$
--
-- Создать функцию "calc_date_range"
--
CREATE FUNCTION calc_date_range(date_start DATE, date_end DATE)
RETURNS text CHARSET latin1
SQL SECURITY INVOKER
BEGIN
DECLARE res_text text;
DECLARE tmp_date date;
IF(date_end < date_start) THEN
RETURN '';
END IF;
SET tmp_date := date_start;
SET res_text :='';
WHILE(tmp_date<=date_end) DO
SET res_text := CONCAT(res_text,',',DATE_FORMAT(tmp_date, '%m-%d-%Y'));
SET tmp_date := DATE_ADD(tmp_date, INTERVAL 1 DAY);
END WHILE;
RETURN SUBSTRING(res_text,2);
END

Либо вы хотите получить список дней для всех задач под условие. Для этого придется заполнить табличку "календарь" (например с полями (`cdate`,`weekend`,`lolshta`))
И получить запросом вида:
SELECT c.cdate FROM tasks t
INNER JOIN calendar c ON c.cdate >= DATE(t.date_from) AND c.cdate<=DATE(t.date_to)
WHERE
t.USER_ID = 17
AND t.status = 4
AND NOT c.weekend = 1
GROUP BY c.cdate;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы