@Attyla3121

Как составить запрос MYSQL, чтобы извлечь записи без пересечения дат?

Нужно в БД найти все записи у которых интервалы дат не имеют пересечения с запрашиваемым интервалом.
Допустим запрашиваемый интервал состоит из start_date и end_date. Данные об интервалах записей находится в столбце date_ranges. Проблема в том что данные об интервалах дат имеют неудобный вид они хранятся в таком виде:
"YYYY-MM-DD - YYYY-MM-DD/YYYY-MM-DD - YYYY-MM-DD/YYYY-MM-DD - YYYY-MM-DD". Как составить запрос, чтобы извлечь записи без пересечения дат?

Пример:
CREATE TABLE IF NOT EXISTS `test` (
  `id` int(6) unsigned NOT NULL,
  `content` varchar(200) NOT NULL,
  `date_ranges` mediumtext NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `test` (`id`, `content`, `date_ranges`) VALUES
  ('1', 'content1', '2018-10-30 - 2018-11-05/2018-11-12 - 2018-11-14/2019-01-15 - 2019-08-22'),
  ('2', 'content2', '2018-12-15 - 2018-12-17/2018-11-15 - 2018-11-22'),
  ('3', 'content3', '2018-09-30 - 2018-11-19/2018-11-11 - 2018-11-16/2019-01-16 - 2019-08-18/2018-10-30 - 2018-11-05'),
  ('4', 'content4', '2018-10-30 - 2018-11-05'),
  ('5', 'content5', '');


sqlfiddle.com/#!9/4b2dcf/1
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Чисто в MySQL - только если писать хранимую процедуру, но это не лучший вариант.
Если есть возможность, то лучше изменить базу, вынеся интервалы в таблицу вида (`id`, `content_id`, `start_date`, `end_date`).
Если такой возможность нет, значит придётся выбирать все строки и анализировать их в клиенте.
Само условие непересечения интервалов простое:
end_date_1 < start_date_2 || end_date_2 < start_date_1
Ответ написан
Ваш ответ на вопрос

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

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