2012-04-17 2 views
0

В настоящее время я работаю над созданием запроса SQL по предложениям.SQL - Показать предложения между диапазонами

В основном предложение имеет дату начала и окончания.

Сценарий 1: Пользователь указывает только дату.

Решение 1: Все предложения - это отображение, которое начинается или проходит в этот день.

Сценарий 2: Пользователь указывает только дату ТО.

Решение 2: Все предложения - это отображение, которое заканчивается или до указанной даты.

Сценарий 3: Пользователь указывает дату TO и FROM для поиска.

Проблема с решением 3 заключается в следующем.

предложение - от 01.01.2012 до 03.03.2012

ПОИСК - от 01.01.2012 до 02.02.2012

Предложение должно вернуться в запросе, как это падает между двумя значениями поиска.

Мой текущий запрос ниже, однако он не работает по мере необходимости.

CREATE PROCEDURE [dbo].[GetAllOffers] 
    @retailer_id  BIGINT, 
    @opt_in    BIGINT, 
    @use_once   BIGINT, 
    @from_date   DATETIME, 
    @to_date   DATETIME 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements. 
    SET NOCOUNT ON; 

    SELECT  retr.Name, 
       reco.Headline, 
       reco.isOptIn, 
       reco.isUseOnce, 
       reco.DateValidFrom, 
       reco.DateExpires, 
       reco.Id      AS OfferId 

    FROM  RetailerCoupon    reco 

    INNER JOIN Retailer     retr 
    ON   reco.RetailerId    = retr.Id 

    WHERE  (reco.RetailerId   = @retailer_id 
    OR   @retailer_id    IS NULL) 
    AND   (reco.isOptIn    = @opt_in 
    OR   @opt_in      IS NULL) 
    AND   (reco.isUseOnce    = @use_once 
    OR   @use_once     IS NULL) 
    AND   (reco.DateValidFrom   >= @from_date 
    OR   @from_date     IS NULL) 
    AND   (reco.DateExpires   <= @to_date 
    OR   @to_date     IS NULL) 

    ORDER BY retr.Name 

END 
GO 

Пожалуйста, обратите внимание, сценарии 1 & 2 охватываются запросом выше его 3, который является причиной проблемы.

Стивен

+0

Проверьте эту дискуссию о том, как выбрать строки с диапазоном дат в даты диапазон: http://stackoverflow.com/questions/730722/how-to-determine-if-a-date-range-occurs-any-time-within-another-date-range – PatrikAkerstrand

+0

Привет, Патрик, проблема с этим решением есть ли у меня критерии поиска, которые имеют только дату начала или имеют только дату окончания ИЛИ имеет период времени. – swade1987

+0

Итак, вам нужно объяснить, что должно произойти для каждого из этих случаев, учитывая разные критерии поиска. – PatrikAkerstrand

ответ

0

Я все еще испытывая это и пытается улучшить его, но это следовать вашим потребностям:

Некоторые тестовые данные

declare @tmp table (offer nvarchar(30), startTime datetime, endTime datetime) 
insert @tmp values ('Offer_1','2012-04-01','2012-04-10'),('Offer_2','2012-04-05','2012-04-15'),('Offer_3','2012-04-10','2012-04-20'),('Offer_!!!','2012-01-01','2012-03-03') 

Offer_!!! ваш пример выше

select * 
from @tmp 
where 
    -- Scenario1 
    (@from_date <= startTime AND @to_date IS NULL) 
OR -- Scenario2 
    (@from_date IS NULL AND @to_date <= endTime) 
OR -- Scenario3 
    ((@from_date BETWEEN startTime AND endTime) 
     AND 
     (@to_date BETWEEN startTime AND endTime)) 

Дает:

-- Scenario 1 
EXEC GetAllOffers @from_date = '2012-04-01' 
    , @to_Date = null 

offer       startTime    endTime 
------------------------------ ----------------------- ----------------------- 
Offer_1      2012-04-01 00:00:00.000 2012-04-10 00:00:00.000 
Offer_2      2012-04-05 00:00:00.000 2012-04-15 00:00:00.000 
Offer_3      2012-04-10 00:00:00.000 2012-04-20 00:00:00.000 


-- Scenario 2 
EXEC GetAllOffers @from_date = null 
    , @to_Date = '2012-01-09' 

offer       startTime    endTime 
------------------------------ ----------------------- ----------------------- 
Offer_1      2012-04-01 00:00:00.000 2012-04-10 00:00:00.000 
Offer_2      2012-04-05 00:00:00.000 2012-04-15 00:00:00.000 
Offer_3      2012-04-10 00:00:00.000 2012-04-20 00:00:00.000 
Offer_!!!      2012-01-01 00:00:00.000 2012-03-03 00:00:00.000 


-- Scenario 3 
EXEC GetAllOffers @from_date = '2012-01-01' 
    , @to_Date = '2012-02-02' 

offer       startTime    endTime 
------------------------------ ----------------------- ----------------------- 
Offer_!!!      2012-01-01 00:00:00.000 2012-03-03 00:00:00.000 

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

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