2012-01-23 2 views
2

Я не знаю, возможно ли это. У меня есть таблица MySQL, содержащая даты начала и окончания сезона для рекламодателей. Даты не меняются из года в год, поэтому они хранятся в формате MM-DD.выберите данные по диапазону дат с упаковкой года

Обычно они предназначены в течение года, то есть 1 марта (03-01) до 1 октября. (10-01).

НО сезоны могут обернуться вокруг конца года, например, 1 октября. (10-01) до 1 марта (03-01) (т.е. они закрыты весной & летом)

Теперь мне нужно выбрать записи (через PHP), где диапазон дат введен пользователем (скажем, 1 декабря до 12 декабря.) попадает в даты начала/окончания сезона рекламодателя.

Легко, если начало/конец сезона были математически последовательными (например, 03-01-10-01), но как это сделать, когда они могут или не могут быть последовательными.

Извините, если я нету объяснил, что ясно, но моя голова вот-вот взорвется ....

+0

есть ли способ, вы можете сделать небольшое изменение в приложение/table, чтобы сохранить год? –

+0

Какие типы столбцов являются вашими столбцами начала/конца сезона? Если они являются столбцами DATE, тогда эта проблема тривиальна для решения, нет? Если они не являются столбцами DATE, они должны быть. :-) – FtDRbwLXw6

ответ

0

вы должны быть в состоянии использовать и заявление, в вашем SQL для проверки двух возможностей:

SELECT * FROM table WHERE 
season_start_date <= advertiser_start_date AND 
season_end_date >= advertiser_end_date OR 

Независимо от того, какая дата окончания сезона должна быть более высокой, чем дата окончания объявления, даже если она находится в новом году. Так что это должно работать, но я согласен с @SoboLAN, это было бы намного проще, если бы вы просто добавили год в поля даты.

2

Для получения этих данных используйте соответствующий тип столбца (DATE), а упаковка в сезон станет нецелесообразной.

Чтобы получить сезон (ы), что поставляемые пользователем диапазон дат относится:

SELECT foo 
FROM seasons_table 
WHERE <user range low> >= season_range_low 
AND <user range high> <= season_range_high 
1

Как насчет:

SELECT * 
    FROM table 
    WHERE CASE 
      WHEN date_start > date_end THEN 
       $date_to_check >= date_start OR $date_to_check <= date_end 
      ELSE 
       $date_to_check >= date_start AND $date_to_check <= date_end 
      END; 
+0

+1 Это делает это красиво, без DATE-ifying. (Обратите внимание, что никакие строки не будут возвращены, если '$ date_to_check IN (date_start, date_end)', но это ничего не делает. =/<= Не может исправить.) – pilcrow

+0

@pilcrow: Да, вы правы. Ответ отредактирован. – Toto

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