首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止重叠时间段的约束

问防止重叠时间段的约束
EN

Database Administration用户
提问于 2016-03-22 18:20:02
回答 1查看 3.5K关注 0票数 3

我有一个非常简单的表,它存储一个StartTime和一个EndTime,两者都带有Time(0)的数据类型。我需要强制执行防止任何重叠的约束。“抽头”的时间段是可以的,比如下午2点到3点,下午3点到下午4点。我已经创建了一个用于约束的函数,但是我很难处理跨越午夜时间的时间段。任何帮助都将不胜感激!

SQL Fiddle

这是一种产品每天可供使用的时间。因此,不幸的是,我无法为这些时间段提供确切的日期。

如果产品始终可用,则StartTime和EndTime将是相同的(即00:00:00和00: 00:00:00)。我知道这可能是糟糕的设计。

活动周期仅为24小时窗口。

EndTime大于StartTime的要求被删除了(phew!)。我已经接受了下面的答案,谢谢!

EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-03-22 18:30:33

在24小时限制下,您可以将您的功能更改为:

代码语言:javascript
复制
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,否则你需要做一堆复杂的逻辑。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/133036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档