我想出了一个我很满意的答案,但这有点不合适,如果提供了一个更优雅的答案,我会非常乐意接受更优雅的答案。另外,我还没有彻底地测试过,因为它在一天晚了,但如果我的逻辑有缺陷,我会很乐意修改或接受修改的答案。
基本上,我只是要确定一个工作日的星期几是四小时前开始的那一天。这意味着,一直到凌晨3:59,“今天”将在前一天被考虑,这对于这些小时的操作是正确的(我超过了上午3点的关闭时间,以说明一个站点决定保持打开状态一会儿)。然后,我使用相同的规则将这段时间与最近一次奖金应用于该客户的帐户的时间进行比较。如果两者匹配,奖金将在这个营业日应用。如果它们不同,则它不具有,并且客户有资格。
DECLARE @CustID AS int
DECLARE @LastBonus AS date
DECLARE @BonusDue AS bit
SET @LastBonus = (SELECT TOP 1 [DateTime] FROM Audit WHERE CustomerID = @CustID AND TransactionType = 'BONUS' ORDER BY [DateTime] DESC)
IF (SELECT DATEADD(hh, -4, CURRENT_TIMESTAMP)) <>
(SELECT DATEADD(hh, -4, @LastBonus))
BEGIN
SET @BonusDue = 1
END
ELSE
BEGIN
SET @BonusDue = 0
END
如果我把这个存储过程,我可以简单地扔在一个客户ID,并把它吐了一下那会告诉我1如果客户符合条件,否则为0。我不喜欢它的是,如果客户的营业时间早得多,我就会陷入沉寂(我估计在上午7点左右,仅仅减去四个小时就会重叠到前一个营业日,但减去不足以达到前一个营业日)。所以它暂时会奏效,但我很想看到更好的解决方案。
这样,如果您昨天晚上11点和今天晚上9点买了一件物品,您将拒绝客户的折扣。 – blubb 2011-05-03 15:26:53
@Simon Stelling,请看最新的编辑版本 – dawebber 2011-05-03 15:40:23