Я придумала ответ, который меня устраивает, но он немного неуклюжий, и я был бы более чем рад принять более элегантный ответ, если он будет предоставлен. Кроме того, я не проверил это до конца, поскольку уже поздно, но если в моей логике есть недостатки, я с радостью пересмотрю или приму ответ с исправлениями.
По сути, я просто собираюсь определить, что день недели с точки зрения рабочего дня - это день, который начался четыре часа назад. Это означает, что вплоть до 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
Если я добавлю это в хранимую процедуру, я могу просто добавить в нее идентификатор клиента и выдать ему немного, который покажет мне 1, если клиент имеет право, 0 в противном случае. Что мне не нравится в этом, так это то, что, если часы работы клиента заканчиваются намного раньше, я буду потоплен (я думаю, около 7:00 утра, когда простое вычитание четырех часов будет совпадать с предыдущим рабочим днем, но вычитание меньше не будет достаточным для достижения предыдущего рабочего дня). Так что пока это сработает, но я бы хотел увидеть лучшее решение.