2012-04-17 70 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 

在我的脑海里,也有你的要求了一些非常大的洞,但是这似乎做什么,你在你的情况都问