2017-09-16 135 views
0

我正在打折以便在特定時間訂購時應用折扣。如何選擇結束時間爲第二天的開始時間和結束時間之間的記錄

一切工作正常,但我有一個奇怪的來自客戶的要求。我的客戶有一個午夜特別。當顧客在2小時內下訂單(從晚上11點到凌晨1點)時,他們希望創建一個特價,其中包含高達50%的折扣(基於$$$數量訂單)。

正如你所看到的,凌晨1點是第二天。因此,它是從晚上11點今天到凌晨1點第二天

目前這裏是我的存儲過程(將選擇基於總支出的最佳優惠):

CREATE PROCEDURE [uspGetBestDiscount] 
(
    ... 
    ... 
    ... 
    @TotalSpend FLOAT = 0, 
    @OrderDate DATETIME = NULL,  --NULL to use today date. 
    @DiscountRate FLOAT = NULL OUT, 
    @DiscountId INT = NULL OUT 
) 
AS 
BEGIN 
    IF (@OrderDate IS NULL) SET @OrderDate = GETDATE(); 
    DECLARE @OrderTime TIME = CAST(@OrderDate AS TIME) 

    SET @DiscountId = NULL; SET @DiscountRate = NULL; 
    SELECT TOP 1 @DiscountId = [DiscountId], @DiscountRate = [DiscountRate] 
    FROM [tblDiscount] 
    WHERE (@TotalSpend >= [MinSpend]) AND 
      (@OrderTime >= CAST([StartTime] AS TIME)) AND 
      (@OrderTime <= CAST([EndTime] AS TIME)) AND 
      ... 
      ... 
      ... 
    ORDER BY [DiscountRate] DESC; 
END; 

一切工作罰款只要StartTime <= EndTime。任何想法如何使EndTime作爲第二天StartTime > EndTime

感謝

+0

使用DATEADD函數 –

+0

@Thebeginner - 是的,但我不能鍛鍊如何使用DATEADD的開始時間和結束時間日期始終01/01/1970(這是因爲啓動時間和結束時間不關心日期,只是時間)。 – Sam

回答

1
WHERE (@TotalSpend >= [MinSpend]) AND 
(
    (
     /* E.g. 8pm - 10pm: */ 
     (
      CAST([StartTime] AS TIME) 
       < 
      CAST([EndTime] AS TIME) 
     ) 
      AND 
     (
      (@OrderTime >= CAST([StartTime] AS TIME)) 
       AND /* Note: AND */ 
      (@OrderTime <= CAST([EndTime] AS TIME)) 
     ) 
    ) 
     OR 
    (
     /* E.g. 11pm - 1am: */ 
     (
      CAST([StartTime] AS TIME) 
       > 
      CAST([EndTime] AS TIME) 
     ) 
      AND 
     (
      @OrderTime >= CAST([StartTime] AS TIME) 
       OR /* Note: OR */ 
      @OrderTime <= CAST([EndTime] AS TIME) 
     ) 
    ) 
) 
... 
相關問題