@MeatPixel

Выборка диапазона дат по двум столбцам из MySQL?

Всем доброго дня, возникла куча вопросов и если честно голова уже идет кругом при работе с датами.
Дано:
Есть таблица mysql с событиями, у этих событий есть начало и конец

id / start_time / end_time / text 

1 10.09.2019 12.09.2019  Данное событие имеет начало и конец в этом месяце
2 10.08.2019 12.09.2019  Данное событие имеет начало в прошлом месяце и конец в этом месяце
3 10.09.2019 12.10.2019  Данное событие имеет начало в этом месяце и конец в следующем
4 10.08.2019 12.10.2019  Данное событие имеет начало в прошлом месяце и конец в следующем


Ну и разумеется есть сайт на котором выводится таблица на текущий месяц с 1 по последний день месяца.
Моя задача в ней отобразить сами события закрасив соответствующие ячейки таблицы, например если событие длится с 5 по 10, то закрашиваю эти ячейки в нужной строке.

Загвоздка в том, что как бы я не делал выборку, у меня либо вообще не попадает id 4 в выборку, либо попадают те данные которые не относятся к текущему месяцу.

Собственно как составить такое условие, чтобы выбрать все 4 строки из базы?
ну и разумеется чтобы не попали лишние данные.

Поясню почему 4 строка относится к этому месяцу:
Событие хоть и имеет начало и конец отличные от текущего, но является событием этого месяца, так как по сути весь этот месяц оно и длится. то есть, в моем случае мне нужно закрасить в таблице всю строку с 1 по последний день месяца

Заранее спасибо за ваши ответы! Всем Добра =)
  • Вопрос задан
  • 203 просмотра
Решения вопроса 2
@S-a-n-d-r-0
Дан некий текущий месяц.
Событие попадает, если
1) его начало в текущий месяце;
2) его конец в текущий месяце;
3) его начало в месяце<текущего И конец в месце >текущего.
Всего три случая. Значит нужен WHERE (1 условие) OR (2е условие) OR (3 условие).
  • Первое условие выполняется, если (start_time >= 01.НужныйМесяц.НужныйГод) AND (start_time < 01.НужныйМесяц+1.НужныйГод)
  • Второе - по аналогии, но только уже с end_time.
  • Третье - (start_time < 01.НужныйМесяц.НужныйГод) AND (end_time >= 01.НужныйМесяц+1.НужныйГод)


Вот пример, как это можно сделать. Только очень корявый, т.к. написан на SQLite. На MySQL будет чуток по-другому, но смысл тот же. Тестировал на https://www.jdoodle.com/execute-sql-online/
create table tab(id int, start text, end text);

/* YYYY-MM-DD */
insert into tab values(1, '2019-09-10', '2019-09-12');
insert into tab values(2, '2019-08-07', '2019-11-12');
insert into tab values(3, '2018-05-12', '2018-06-12');
insert into tab values(4, '2018-01-12', '2019-03-12');
insert into tab values(5, '2019-08-10', '2019-09-12');
insert into tab values(6, '2019-09-10', '2019-10-12');
insert into tab values(7, '2019-08-10', '2019-10-05');
insert into tab values(8, '2019-08-10', '2019-08-12');
insert into tab values(9, '2019-07-10', '2019-08-12');
insert into tab values(10, '2019-09-30', '2019-10-01');

select * from tab WHERE ((date(start) >= date('2019-09-01')) AND (date(start) < date('2019-10-01'))) OR ((date(end) >= date('2019-09-01')) AND (date(end) < date('2019-10-01'))) OR ((date(start) < date('2019-09-01')) AND (date(end) >= date('2019-10-01')));
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Интервалы НЕ пересекаются, тогда и только тогда, когда один из них находится после другого. То есть
start2 > end1 || start2 > end1
Но нам надо получить условие пересечения, то есть условие отрицания непересечения
~(start2 > end1 || start2 > end1) = 
= ~(start2 > end1) && ~(start2 > end1) = 
= start2 <= end1 && start2 <= end1

Три условия от S-a-n-d-r-0 тоже можно привести в этот вид. Используйте булеву логику.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы