0

現在、オファーに関する 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 より上のクエリでカバーされていることに注意してください。

スティーブン

4

1 に答える 1

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

私の考えでは、要件には非常に大きな穴がいくつかありますが、これはシナリオで要求したことを実行しているように見えます

于 2012-04-17T11:46:10.933 に答える