Intereting Posts
Обнаружение таймаута для блока кода в PHP PHP. Подготовьте URL-адрес ко всем ссылкам без http или https. mySql – создание соединения с использованием списка значений, разделенных запятыми Переадресация категории Magento отключает запрос URL-адреса Linkedin разделяет URL-адреса / не анализирует открытый граф Как установить внешнюю ссылку URL-адреса в меню администратора Magento Примечание. Попытка получить свойство ошибки, отличной от объекта Vagrant – удаленное подключение к mysql – внешнее соединение брандмауэра ssh Преобразование записи MySQL в строку JSON в PHP Как суммировать общее время, используя каждую неделю месяца? PHP Передача по ссылке в foreach с помощью приглашения браузера загрузить файл Как запустить работу cron с помощью zend framework 2 Если на странице есть ошибка JavaScript, не загружается ли карта google? Точка в многоугольнике с использованием geoPHP

php mysql двойной диапазон дат

Я работаю над календарями событий, и мне трудно найти запрос 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');