Расширенный MySQl-запрос для извлечения записей с конкретными датами в пределах одной таблицы - PullRequest
0 голосов
/ 02 августа 2010

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

Пример таблицы: Столбцы рекламных предложений:

ID   startDate     EndDate     Discount     CategoryID  
=============================================================
1    2010/08/01    2010/08/10     10.00        A
2    2010/08/01    2010/08/10     15.00        B
3    2010/08/11    2010/08/15     05.00        A
4    2010/08/11    2010/08/15     10.00        B

Я знаю, что могу получить повышение по совпадению из следующего запроса, когда заданы два диапазона дат

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND endDate >= "2010/08/15") AND CategoryID = A

В результате выполнения вышеуказанного запроса будет выбрана строкас идентификатором 3

Однако, если два диапазона дат в приведенном выше запросе были изменены на что-то вроде следующего:

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND endDate >= "2010/08/18") AND CategoryID = A

Я не получаю никакого согласованного результата, так как я могу понять логикуне соответствует ни одной из сохраненных данных в таблице.

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

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND CategoryID = A

Верный результат, который мне нужен, - это способ преобразовать этот запрос в цикл или использовать временную таблицу MySQL в памяти для получения результатов за каждый день, как показано ниже.

Результат, который мне нужно найти для диапазона дат с 2010/08/12 по 2010/08/18

===================================================================
Date           Discount    
=========================
2010/08/12      05.00
2010/08/13      05.00
2010/08/14      05.00
2010/08/15      05.00
2010/08/16      null
2010/08/18      null

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

Надеюсь увидеть отличный ответ на этот вопрос.

Ответы [ 2 ]

1 голос
/ 02 августа 2010

Вам нужна календарная таблица дат, которая выглядит примерно так:

Create Table Calendar ( [Date] DateTime Not Null Primary Key )

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

Select C.Date, P.Discount
From Calendar As C
    Left Join Promotions As P
        On C.Date Between P.StartDate And P.EndDate
            And P.Category = 'A'
1 голос
/ 02 августа 2010

Чтобы запросить элементы, находящиеся в диапазоне дат, используйте:

SELECT * 
FROM Promotions 
WHERE (startDate >= "2010/08/12" AND endDate <= "2010/08/15") 
AND CategoryID = A

, чтобы начальная дата была больше или равна, а конечная дата была меньше или равна.

...