Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сравнение даты по нескольким полям
 
 автор: Keyses   (03.04.2011 в 12:52)   письмо автору
 
 

Есть таблица со следующими полями:
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), это я что-то никак не могу сообразить, помогите пожалуйта...

  Ответить  
 
 автор: cheops   (03.04.2011 в 13:05)   письмо автору
 
   для: Keyses   (03.04.2011 в 12:52)
 

>нужно чтобы, если на вход поступают 2 даты 2011-05-29 и 2011-06-24
Не очень пока понятно. Первая и вторая дата к каким полям относятся (только start, start и end)?

  Ответить  
 
 автор: Keyses   (03.04.2011 в 13:20)   письмо автору
 
   для: cheops   (03.04.2011 в 13:05)
 

они просто должны попадать в промежуток.
Первая дата 2011-05-29 попадает в промежуток {2011-05-20, 2011-06-10} первой строки
Вторая 2011-06-24 попадает в промежуток {2011-06-12, 2011-06-26} второй строки.

В частном случае обе даты могут попасть в промежуток одной строки.

  Ответить  
 
 автор: cheops   (03.04.2011 в 15:06)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Keyses   (03.04.2011 в 15:24)   письмо автору
 
   для: cheops   (03.04.2011 в 15:06)
 

C условием
(UNIX_TIMESTAMP(`end`) - UNIX_TIMESTAMP(`start`)) < 86400
не сработал ни один из двух запросов. Скорее всего потому что он смотрит end и start в пределах одной строки а не текущую с соседней сравнивает.
По поводу второго запроса, если дата окончания не находится ни в одном промежутке - запрос должен возвращать пустой результат, независимо от того попала ли дата начала.

  Ответить  
 
 автор: cheops   (03.04.2011 в 16:32)   письмо автору
 
   для: Keyses   (03.04.2011 в 15:24)
 

>не сработал ни один из двух запросов. Скорее всего потому что он смотрит end и start в пределах
>одной строки а не текущую с соседней сравнивает.
Тогда подробнее опишите следующее условие (один день между чем и чем сравнивается)
>если разрым между датой окончания и датой начала в БД не превышает один день

  Ответить  
 
 автор: Keyses   (03.04.2011 в 16:48)   письмо автору
 
   для: 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 штук.

  Ответить  
 
 автор: cheops   (03.04.2011 в 18:17)   письмо автору
 
   для: Keyses   (03.04.2011 в 16:48)
 

Хм... а в базе ничего менять нельзя? Т.е. нельзя ли сформировать временную/вспомогательную таблицу с датами-исключениями (заказы ведь в рамках одного года происходят)?

  Ответить  
 
 автор: Keyses   (03.04.2011 в 19:07)   письмо автору
 
   для: cheops   (03.04.2011 в 18:17)
 

Нет - нельзя, для каждого периода своя цена и некоторые другие уникальные параметры. + Это лишнее действие: высчитывать даты и делать временную таблицу. Неужели нет нормального способа для поиска только лишь средствами sql? PHP+SQL понятное дело могут решить эту проблему, но уж очень страшным и не красивым представляется мне этот симбиоз....

  Ответить  
 
 автор: cheops   (03.04.2011 в 19:32)   письмо автору
 
   для: Keyses   (03.04.2011 в 19:07)
 

Хорошо, правильно ли я понимаю, что в базе данных интервалы не перекрываются? Т.е. нам достаточно найти строки, в которые запрашиваемый интервал входит целиком?

  Ответить  
 
 автор: Keyses   (03.04.2011 в 19:44)   письмо автору
 
   для: cheops   (03.04.2011 в 19:32)
 

да, интервалы перекрываться не могут., ну и если они разрываются на некий период, и он попадает в запрошенный интервал - то возвращать пустой результат.

  Ответить  
 
 автор: cheops   (03.04.2011 в 20:18)   письмо автору
 
   для: Keyses   (03.04.2011 в 19:44)
 

Тогда запрос должен выглядеть как-то так
SELECT * FROM tbl 
WHERE p_id = 1 AND  
'2011-05-29' >= `start` AND  
'2011-06-24' <= `end`
А факт, того, что между датами было больше суток, лучше отслеживать на уровне проверки правильности заполнения формы, если форма заполнена не правильно, то и базу данных дергать не по что.

  Ответить  
 
 автор: Keyses   (04.04.2011 в 00:45)   письмо автору
 
   для: cheops   (03.04.2011 в 20:18)
 

Немного изменил и заработало. Странно что не работало. спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования