2012-04-17 8 views
0

現在、オファーの周りにSQLクエリを作成中です。SQL - 範囲内のオファーを表示

基本的にオファーには開始日と終了日があります。

シナリオ1:ユーザーはからの日付のみを指定します。

解決策1:すべてのオファーは、その日以降に開始される表示です。

シナリオ2:ユーザーはTO日付のみを指定します。

解決策2:すべてのオファーは、指定された日付またはその前に終了する表示です。

シナリオ3:ユーザーは、検索するTO日付とFROM日付の両方を指定します。

解決策3の問題は次のとおりです。

オファー - 2012年1月1日から2012年3月3日

検索するには - 2012年1月1日から2012年2月2日

へのオファーはそれとしてクエリに返す必要があります2つの検索値の間に入ります。

私の現在のクエリは以下のとおりですが、必要に応じて機能しません。

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

こんにちはPatrik、その解決策の問題私は開始日だけを持つ検索基準を持つことができますか、または終了日を持つか、または期間がありますか? – 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 

、そこにあなたの要件のいくつかの非常に大きな穴がありますが、これはあなたのシナリオで

関連する問題