1

テーブルには、DiscountStart 列と DiscountEnd 列があります。両方の列に Month+'/'+Day 値が保持されます。

 Product     DiscountStart     DiscountEnd     Rate
 --------------------------------------------------
 Product1     'Dec/10'          'Jan/05'        10% 
 Product2     'Nov/01           'Dec/31'        12% 
 Product3     'May/01'          'Jun/30'        08% 
 Product4     'Sep/01'          'Sep/15'        05%

DiscountStart購入日が購入年の~の期間にある場合、商品に割引率を適用する必要がありますDiscountEnd。助けてください。

4

3 に答える 3

0

このように日付の範囲を保存している理由はわかりませんが、 WHERE <PurchaseDate> BETWEEN DiscountStart and DiscountEnd一般的に使用することをお勧めします。3 文字のコードを解析して数字に置き換え、年を追加します。このような:

SELECT p.Price * DiscTbl.Rate DiscountedRate, *
FROM 
(
    SELECT
        Product, 
        CASE LEFT(DiscountStart, 3) 
          WHEN 'JAN' THEN '01' 
          WHEN 'FEB' THEN '02'
          WHEN 'MAR' THEN '03'
          .
          .
          .
          ELSE NULL END 
          + RIGHT(DiscountStart, 3) + '/'
          + CAST(DATEPART(YEAR, GETDATE()) AS VARCHAR(4)) AS StartDate
       , 
       CASE LEFT(DiscountEnd, 3) 
          WHEN 'JAN' THEN '01' 
          WHEN 'FEB' THEN '02'
          WHEN 'MAR' THEN '03'
          .
          .
          .
          ELSE NULL END 
          + RIGHT(DiscountEnd, 3) + '/'
          + CAST(DATEPART(YEAR, GETDATE()) AS VARCHAR(4)) AS EndDate,
       Rate
    FROM DiscountTable --Named for the sake of this example
) DiscTbl
join Purchases p --Named for the sake of this example
     on p.Product = DiscTbl.Product 
    and p.PurchaseDate BETWEEN 
                          CASE WHEN DiscTbl.StartDate > DiscTbl.EndDate 
                               THEN DATEADD(YEAR, -1, DiscTbl.StartDate)
                               ELSE DiscTbl.StartDate 
                          END
                       AND DiscTbl.EndDate 
于 2013-10-02T00:10:02.597 に答える
0

特定の日付に適用される割引を取得するには、

select
*
from
(
    select 
        product,
        startdate,
        case when (enddate<startdate) then DATEADD(YY,1,enddate)else enddate end enddate,
        rate
    from
        (
            select 
                CONVERT(date, convert(varchar(4),year(getdate()))+'/'+discountstart) as startdate,
                CONVERT(date, convert(varchar(4),year(getdate()))+'/'+discountend) as enddate,
                product, rate from yourtable
            union 
            select 
                CONVERT(date, convert(varchar(4),year(getdate())-1)+'/'+discountstart) as startdate,
                CONVERT(date, convert(varchar(4),year(getdate())-1)+'/'+discountend) as enddate,
                product, rate from yourtable

        ) v
) discounts
where GETDATE() between startdate and enddate

そこから、購入に簡単な操作left joinを行って、割引が適用されるかどうかを確認できます.

于 2013-10-02T08:22:50.910 に答える