SQL-Show提供范围介于

SQL-Show提供范围介于,sql,tsql,sql-server-2008-r2,Sql,Tsql,Sql Server 2008 R2,我目前正在围绕报价构建一个SQL查询 基本上,报价有开始和结束日期 场景1:用户仅指定起始日期 解决方案1:所有优惠都显示在当天或之后开始 场景2:用户只指定了一个截止日期 解决方案2:显示所有在给定日期或之前结束的优惠 场景3:用户指定要搜索的截止日期和起始日期 解决方案3的问题如下 报价-从2012年1月1日至2012年3月3日 搜索-从2012年1月1日至2012年2月2日 当报价介于两个搜索值之间时,应在查询中返回 我当前的查询如下,但是它没有按要求工作 CREATE PROCEDURE

我目前正在围绕报价构建一个SQL查询

基本上,报价有开始和结束日期

场景1:用户仅指定起始日期

解决方案1:所有优惠都显示在当天或之后开始

场景2:用户只指定了一个截止日期

解决方案2:显示所有在给定日期或之前结束的优惠

场景3:用户指定要搜索的截止日期和起始日期

解决方案3的问题如下

报价-从2012年1月1日至2012年3月3日

搜索-从2012年1月1日至2012年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之上


Steven

我仍在测试并试图改进它,但这是否符合您的需要:

一些测试数据

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')
提供!!!!上面是你的例子吗

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))

在我看来,您的需求中存在一些非常大的漏洞,但这似乎符合您在场景中提出的要求

查看此讨论,了解如何选择日期范围在日期范围内的行:Hi Patrik,该解决方案的问题是,我可以使用只有开始日期、结束日期或时间段的搜索条件。因此,您需要解释在给定不同搜索条件的情况下,每种情况下应该发生什么。现在我的附加注释对您更有意义吗?
-- 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