|
|
|
| Есть таблица со следующими полями:
id (INT)
start (TIMESTAMP)
end (TIMESTAMP)
price (FLOAT)
p_id (INT)
1 2011-05-20 2011-06-10 155 1
2 2011-06-11 2011-06-26 165 1
нужно чтобы, если на вход поступают 2 даты 2011-05-29 и 2011-06-24 проверялось не одно поля а все, с одинаковым p_id и если разрым между датой окончания и датой начала в БД не превышает один день и указанный промежуток попадает в эти даты - выдавала результат.
Пример того, что не должно сработать при данном запросе, т.к. есть разрыв между датами.
1 2011-05-20 2011-06-10 155 1
2 2011-06-12 2011-06-26 165 1
По одному полю всё тривиально, но вот по N полям, да ещё и сравнивать end поля(N-1) и start поля(N), это я что-то никак не могу сообразить, помогите пожалуйта... | |
|
|
|
|
|
|
|
для: Keyses
(03.04.2011 в 12:52)
| | >нужно чтобы, если на вход поступают 2 даты 2011-05-29 и 2011-06-24
Не очень пока понятно. Первая и вторая дата к каким полям относятся (только start, start и end)? | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 13:05)
| | они просто должны попадать в промежуток.
Первая дата 2011-05-29 попадает в промежуток {2011-05-20, 2011-06-10} первой строки
Вторая 2011-06-24 попадает в промежуток {2011-06-12, 2011-06-26} второй строки.
В частном случае обе даты могут попасть в промежуток одной строки. | |
|
|
|
|
|
|
|
для: Keyses
(03.04.2011 в 13:20)
| | Если я правильно понял, то для поиска такой даты можно отталкиваться от следующего запроса
SELECT * FROM tbl
WHERE p_id = 1 AND
'2011-05-29' >= `start` AND
'2011-05-29' <= `end` AND
(UNIX_TIMESTAMP(`end`) - UNIX_TIMESTAMP(`start`)) < 86400
| Если нужно сравнение двух дат одновременно, то запрос может выглядеть так
SELECT * FROM tbl
WHERE p_id = 1 AND
(('2011-05-29' >= `start` AND
'2011-05-29' <= `end`) OR
('2011-06-24' >= `start` AND
'2011-06-24' <= `end`)) AND
(UNIX_TIMESTAMP(`end`) - UNIX_TIMESTAMP(`start`)) < 86400
|
| |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 15:06)
| | C условием
(UNIX_TIMESTAMP(`end`) - UNIX_TIMESTAMP(`start`)) < 86400
| не сработал ни один из двух запросов. Скорее всего потому что он смотрит end и start в пределах одной строки а не текущую с соседней сравнивает.
По поводу второго запроса, если дата окончания не находится ни в одном промежутке - запрос должен возвращать пустой результат, независимо от того попала ли дата начала. | |
|
|
|
|
|
|
|
для: Keyses
(03.04.2011 в 15:24)
| | >не сработал ни один из двух запросов. Скорее всего потому что он смотрит end и start в пределах
>одной строки а не текущую с соседней сравнивает.
Тогда подробнее опишите следующее условие (один день между чем и чем сравнивается)
>если разрым между датой окончания и датой начала в БД не превышает один день | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 16:32)
| | Ок попробую описать иначе:
Есть лагерь, в него хочет заехать новый человек и пробыть там с 2011-05-29 по 2011-06-24.
В базе у нас хранится доступность мест в лагере и цена:
1 2011-05-20 2011-06-10 155 1
2 2011-06-12 2011-06-26 165 1
отсюда видно что 2011-06-11 лагерь не работает (ну к примеру закрыт на проф ремонт), потому человек не может заехать туда в указанные сроки. (один день выпадает) если ничего не выпадает тогда хорошо. Проблема в том, как сравнивать отличается ли 20 2011-06-10 из первой строки в БД и 2011-06-12 более чем на сутки, потому как сравнение, насколько я понимаю происходит в пределах одной(текущей) строки. В общем случае этих строк с периодами дат и ценами может быть N штук. | |
|
|
|
|
|
|
|
для: Keyses
(03.04.2011 в 16:48)
| | Хм... а в базе ничего менять нельзя? Т.е. нельзя ли сформировать временную/вспомогательную таблицу с датами-исключениями (заказы ведь в рамках одного года происходят)? | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 18:17)
| | Нет - нельзя, для каждого периода своя цена и некоторые другие уникальные параметры. + Это лишнее действие: высчитывать даты и делать временную таблицу. Неужели нет нормального способа для поиска только лишь средствами sql? PHP+SQL понятное дело могут решить эту проблему, но уж очень страшным и не красивым представляется мне этот симбиоз.... | |
|
|
|
|
|
|
|
для: Keyses
(03.04.2011 в 19:07)
| | Хорошо, правильно ли я понимаю, что в базе данных интервалы не перекрываются? Т.е. нам достаточно найти строки, в которые запрашиваемый интервал входит целиком? | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 19:32)
| | да, интервалы перекрываться не могут., ну и если они разрываются на некий период, и он попадает в запрошенный интервал - то возвращать пустой результат. | |
|
|
|
|
|
|
|
для: Keyses
(03.04.2011 в 19:44)
| | Тогда запрос должен выглядеть как-то так
SELECT * FROM tbl
WHERE p_id = 1 AND
'2011-05-29' >= `start` AND
'2011-06-24' <= `end`
| А факт, того, что между датами было больше суток, лучше отслеживать на уровне проверки правильности заполнения формы, если форма заполнена не правильно, то и базу данных дергать не по что. | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 20:18)
| | Немного изменил и заработало. Странно что не работало. спасибо. | |
|
|
|