2012-04-17 83 views
0
之間

我目前正在構建圍繞優惠的SQL查詢。SQL - 顯示範圍在

基本上報價有一個開始和結束日期。

情況1:用戶只指定日期。

解決方案1:所有優惠都是在當天或之後開始的顯示。

情景2:用戶只指定TO日期。解決方案2:所有優惠都是在指定日期之前或之前顯示的。

場景3:用戶同時指定要搜索的TO和FROM日期。

解決方案3的問題如下。

優惠 - 從2012年1月1日至03-03-2012

搜索 - 從2012年1月1日至2012-02-02

的報價應在查詢中,因爲它返回落在兩個搜索值之間。

我目前的查詢是在下面,但它沒有按要求工作。

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 2012-04-17 09:45:57

+0

嗨帕特里克,該解決方案的問題是我可以有搜索條件,只有一個開始日期或只有一個結束日期或有一段時間。 – swade1987 2012-04-17 09:48:09

+0

因此,您需要解釋在給定不同搜索條件的情況下,每種情況會發生什麼情況。 – PatrikAkerstrand 2012-04-17 09:51:52

回答

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 

在我的腦海裏,也有你的要求了一些非常大的洞,但是這似乎做什麼,你在你的情況都問