2012-03-21 4 views
0

Учитывая следующие значения YYYY-MM-DDMysql найти диапазон дат

$start = 2012-03-21 
$stop = 2012-07-15 

и следующие записи в БД, а также YYYY-MM-DD

DATE_FROM DATE_TO  PRICE 
    2012-01-01 2012-03-01 123 
    2012-03-01 2012-04-08 123 
    2012-04-09 2012-06-04 456 
    2012-06-04 2012-07-02 789 
    2012-07-02 2012-07-16 111 
    2012-07-17 2012-08-17 222 

Как я могу выбрать все записи которые находятся в диапазоне $start - $stop? Это должно включать в себя все, кроме последней и первой строки

Покушение ниже, который получает записи 2 - 4, но не 5.

SELECT date_from, date_to, price 
    FROM periods 
    WHERE (date(date_from) <= '$start' OR date(date_to) <= '$stop') 

ответ

1

Вы хотите логика что-то вроде этого:

date_to >= $start AND date_from <= $stop 

Если это является то, что вы ищете:

Start-----Stop 
     From-------------------To 

      Start-----Stop 
     From-------------------To 

         Start-----Stop 
     From-------------------To 

Start Обратите внимание, что всегда должен прийти до ToИStop всегда должно прибыть после From для этого перекрытия.

Сообщите мне, если у меня есть какие-либо из моих предположений, что вы ищете. Но, в любом случае, я всегда нахожу что-то вроде этого легче записывать, чтобы вы могли визуализировать и легко видеть, что больше или меньше ситуаций.

+0

WHERE (date (date_to)> = '$ start' AND date (date_from)> = '$ stop') - ничего не возвращает. – stef

+0

Обновлен мой ответ. У меня был ваш/назад, и у меня был логический/опечаток. Я дважды проверил это в своей голове, и он должен получить вам строки 2-5 –

+0

Вы правы, это работает красиво! – stef

0
SELECT date_from, date_to, price 
    FROM periods 
    WHERE (date_from BETWEEN '$start' AND '$stop') AND (date_to BETWEEN '$start' AND '$stop') 
+0

Это не сработает (если мое предположение верно). См. Мой ответ для рассуждений. –

+0

О, я вижу, я сделал это неправильно, параметры должны находиться внутри диапазона от дат базы данных. Хорошее объяснение –

Смежные вопросы