2017-09-16 189 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) 
     ) 
    ) 
) 
... 
相关问题