Подскажите в написании запроса [дата]

4you

еееххххх....
Подскажите в написании запроса [дата]

Есть таблица с 2-мы полями:

start_date | end_date

Есть 2 записи:

2004-06-10 | 2004-06-20
2004-06-25 | 2004-08-12

Есть времянной период: 2004-07-01 - 2004-07-31
Вопрос как правильно написать запрос который выдал бы все записи перекрывающие каким - либо образом данный период. В результате должно получиться две записи.

Мои решения:

1. SELECT start_date,end_date FROM table WHERE start_date>DATE_ADD('2004-08-01',INTERVAL '-1' MONTH) AND start_date<DATE_ADD('2004-08-31',INTERVAL '-1' MONTH)

2. SELECT start_date,end_date FROM table WHERE
DATE_ADD('2004-08-01',INTERVAL '-1' MONTH)>=start_date AND DATE_ADD('2004-08-31',INTERVAL '-1' MONTH)<=end_date
 

Dallas

Guest
1.Если я правильно понял, то ты путаешь запись с доменом таблицы. Ты должен получить одну запись, из которой тебя будут интересовать два поля.
2.Table - зарезервированное слово.
3.Не проще ли date_add('2004-07-31', interval 1 month)
4.В твоем решении искомый интервал полностью включен в заданный - это не есть "перекрывающие каким - либо образом данный период".
5.Чтобы все-таки найти то, что тебе надо, надо рассмотреть еще три случая. Какие - подумай сам. Думаю, неплохо бы использовать (... and ...) or (... and ...)...
 

Фанат

oncle terrible
Команда форума
если перекрывающие не целиком, а каким-то образом, то надо 4 условия, а не два.
 

IL78

Guest
Фанат, разве перекрытие корректных интервалов не гарантировано условием

start_date < конца интервала AND end_date > начала интервала ?

(конечно, в допущении, что start_date < end_date и начало интервала < конца интервала выполняются по определению и не нуждаются в проверке)
 

4you

еееххххх....
2All
Заданный интервал может "входить" в период в таблице как целиком так и раздельно, напрмер таблица может иметь такие значения:
2004-06-10 | 2004-06-20
2004-06-25 | 2004-08-12
2004-07-10 | 2004-07-20
2004-07-25 | 2004-09-22 и т.п.

2Dallas
1.Если я правильно понял, то ты путаешь запись с доменом таблицы. Ты должен получить одну запись, из которой тебя будут интересовать два поля.
Возможно я не правильно выразился. Имелось ввиду что результатом должно быть 2 строки

2.Table - зарезервированное слово.
В курсе. Использовалось для наглядности

3.Не проще ли date_add('2004-07-31', interval 1 month)
К сожалению в мойм случае нет, т.к. известна сегодняшня дата, а месяц нужен прошедший. Но это по-моему не суть важно
 

IL78

Guest
4you, тебе нужно, чтобы хотя бы часть интервала из таблицы приходилась на прошлый месяц? И в твоем примере тебе подходят все строки таблицы кроме первой? Или я не понял твоей задачи?
 

4you

еееххххх....
2IL78
Да именно 3 строчки в данном варианте должны подходить.


УРА
После ваших подсказок и похода в магазин за сигаретами, а также обдумывания данной задачи пришел к работающему варианту:

select * from table
where
(date_add('2004-08-01',interval '-1' month) between start_date and end_date) or
(date_add('2004-08-31',interval '-1' month) between start_date and end_date) or
(start_date between date_add('2004-08-01',interval '-1' month) and date_add('2004-08-31',interval '-1' month)) or
(end_date between date_add('2004-08-01',interval '-1' month) and date_add('2004-08-31',interval '-1' month))
 

Dallas

Guest
На мой взгляд IL78 предложил решение покрасивше (4ый пост топика).
 
Сверху