Задать вопрос
FMars
@FMars

Как сделать такой SQL запрос?

Нужно сделать запрос в котором в выборку попадут записи которые пересекаются периодами.
Например если я ищу записи с 2015-10-05 по 2015-10-10, то в выборку попадет вторая строка (см. картинку), также она должна попадать если я ищу с 2015-10-15 по 2015-10-20, например.

9e57583649cb4857b2d328b02af6592c.jpgxzfsbgcgnxtebsxb.png
  • Вопрос задан
  • 413 просмотров
Подписаться 1 Оценить 10 комментариев
Решения вопроса 2
martin74ua
@martin74ua Куратор тега MySQL
Linux administrator
from <= end_date and to >= start_date
кажется все случаи перекрыты
Ответ написан
@protven
И в чем проблема? Взяли бы бумажку и нарисовали все возможные случаи. Я, если правильно вас понял, думаю что их 4.
Допустим у вас есть временной интервал START_DATE и END_DATE и вам нужно его сравнить на пересечение с отрезками в БД FROM и TO.
Ок.
Первый случай: START_DATE <= FROM < END_DATE <=TO
Второй случай: START_DATE <= FROM < TO <= END_DATE
Третий случай: FROM <=START_DATE <= TO < END_DATE
Четвертый случай: FROM <= START_DATE < END_DATE <=TO
Ну то есть два случая когда отрезки именно что пересекаются концами и два случая, когда один отрезок включает другой полностью.
Ну и тогда запросы выглядит интуитивно понятным.
Или еще можно рассуждать так, чтобы два отрезка пересекались, необходимо и достаточно, чтобы любой из концов одного отрезка лежал между двумя концами второго отрезка.
SELECT * FROM <TABLE> T WHERE 
             <START_DATE> BETWEEN T.FROM AND T.TO OR 
             <END_DATE>     BETWEEN T.FROM AND T.TO  OR
             T.FROM            BETWEEN <START_DATE> AND <END_DATE> OR
             T.TO                BETWEEN <START_DATE> AND <END_DATE> OR;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Therapyx
@Therapyx
Data Science
вот пример, но это MS SQL
ALTER Procedure [dbo].[Procedure_Name] (		
		@SelectByDate1 date = null,
		@SelectByDate2 date = null	
	) as

	 select * 
	 from Table_Name
	 where 
   P_Date >= coalesce(@SelectByDate1, p_Date) 
	 and P_Date <= coalesce(@SelectByDate2, p_Date) 	
	 order by p_date desc

В этом случае есть 2 текстбокса. Если они пустые, то выбиратеся просто select *
from Table_Name. и в зависимости от заполнения дат в текстбоксы будут уже подключатся переменные с сортировкой между датами. Как видишь там P_Date >= and and P_Date <= даже если 1 день попадает под этот промежуток, то он выводится.
в MySQl к сожалению не знаю, есть ли "coalesce"
Ответ написан
Ваш ответ на вопрос

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

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