@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 по последний день месяца

Заранее спасибо за ваши ответы! Всем Добра =)
  • Вопрос задан
  • 317 просмотров
Решения вопроса 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 тоже можно привести в этот вид. Используйте булеву логику.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽