我有一个非常简单的表,它存储一个StartTime和一个EndTime,两者都带有Time(0)的数据类型。我需要强制执行防止任何重叠的约束。“抽头”的时间段是可以的,比如下午2点到3点,下午3点到下午4点。我已经创建了一个用于约束的函数,但是我很难处理跨越午夜时间的时间段。任何帮助都将不胜感激!
这是一种产品每天可供使用的时间。因此,不幸的是,我无法为这些时间段提供确切的日期。
如果产品始终可用,则StartTime和EndTime将是相同的(即00:00:00和00: 00:00:00)。我知道这可能是糟糕的设计。
活动周期仅为24小时窗口。
EndTime大于StartTime的要求被删除了(phew!)。我已经接受了下面的答案,谢谢!
发布于 2016-03-22 18:30:33
在24小时限制下,您可以将您的功能更改为:
CREATE FUNCTION [dbo].[fnIsItemGroupAvailabilityValid]
(
@availabilityStart time(0),
@availabilityEnd time(0)
)
RETURNS int
AS
BEGIN
DECLARE @OverLappingRows int
IF(@availabilityEnd > @availabilityStart)
BEGIN
SELECT @OverLappingRows = count(*)
FROM [dbo].[ItemGroupAvailability] iga
WHERE @availabilityStart < iga.AvailabilityEnd
AND @availabilityEnd > iga.AvailabilityStart
END
ELSE
SET @OverLappingRows = 1
RETURN @OverLappingRows
END这将确保时间是连续的,如果不是,它将返回@OverLappingRows =1作为哨位值,以告诉您出了什么问题。您可以将其设置为-1之类的东西,如果您希望具体地捕捉到该失败案例的话。
我从比较中删除了等号,以便在比较时删除包含方面,现在应该允许时间跨度相互对接,而不是重叠。删除OR,因为这是多余的,因为在运行查询之前,我们要验证这两个时间戳是顺序的。
最后,一整天应该是0:00到23:59,而不是0:00到0:00,否则你需要做一堆复杂的逻辑。
https://dba.stackexchange.com/questions/133036
复制相似问题