Я работаю над календарями событий, и мне трудно найти запрос mysql, который выбирает мои события в заданном диапазоне. Мои события имеют даты начала и окончания, а также мои диапазоны (месяцы).
Я попытался изо всех сил изобразить то, что я ищу: (я хочу выбрать события 1,2,3,4, но не 5 или 6)
|========= April ===========| => Range +--(1)--+ +--(2)--+ => Partialy Overlapping Events +--(3)--+ => Events included in range +----------------(4)----------------+ => Ovelapping events +-(5)-+ +-(6)-+ => Events outside of range
Я нашел этот аналогичный quastion: 2 Column Mysql Date Range Search в PHP, но я не думаю, что это дубликат, как если бы я правильно понял мою проблему, диапазон имеет даты начала и окончания, а в другом вопросе диапазон – это единственная дата.
Решение по-прежнему очень похоже на вопрос, на который вы ссылаетесь; попробуйте этот запрос:
SELECT * FROM events e WHERE `start` <= [RANGE.end] AND `end` >= [RANGE.start]
Конечно, вы должны заменить [RANGE.start] и [RANGE.end] на первую и последнюю дату вашего диапазона. Если, например, RANGE.start = '2011-04-01' и RANGE.end = '2011-04-30', приведенный выше запрос даст все результаты, которые происходят в апреле '11.
В зависимости от того, хотите ли вы выбирать события, которые просто «касаются» диапазона (что означает, что у них есть общая граничная дата, но на самом деле они не перекрываются) или нет, вы можете заменить <=
/ >=
на <
/ >
.
Отдайте это. Я составил таблицу с именем dateRangeExample
чтобы проиллюстрировать ответ:
drop table if exists dateRangeExample; create table dateRangeExample (id int unsigned primary key, startDate date not null, endDate date not null ); insert into dateRangeExample (id,startDate,endDate) values (1,'2011-03-15','2011-04-05'); insert into dateRangeExample (id,startDate,endDate) values (2,'2011-04-25','2011-05-05'); insert into dateRangeExample (id,startDate,endDate) values (3,'2011-04-10','2011-04-15'); insert into dateRangeExample (id,startDate,endDate) values (4,'2011-03-15','2011-05-05'); insert into dateRangeExample (id,startDate,endDate) values (5,'2011-03-01','2011-03-20'); insert into dateRangeExample (id,startDate,endDate) values (6,'2011-05-03','2011-05-25'); select dre.* from dateRangeExample dre where startDate between '2011-04-01' and '2011-04-30' or endDate between '2011-04-01' and '2011-04-30' or (startDate < '2011-04-01' and endDate > '2011-04-30');