1

这适用于(MS SQL Server 2008)它允许用户安排其他用户的开始和结束日期/时间,而不会重叠。

我正在解决在日程安排期间不能重叠个人的业务规则。EG,如果用户 1 计划从 2012 年 1 月 1 日到 2012 年 1 月 4 日,则用户 2 应该无法提交 2012 年 1 月 2 日到 2012 年 1 月 4 日的请求。这部分已经处理好了,这是我的SQL。

SELECT * FROM fooTable
WHERE
    Prim = 1
AND 
    Group = 10
AND
    (('2012-06-01 08:01' between startdate and enddate
   OR '2012-06-03 08:01' between startdate and enddate)
OR
   ('2012-06-01 08:01' < startdate) AND ('2012-06-03 8:01' > enddate))

我现在有一个要求,允许时间表重叠,因为新班次可以在最后一个班次结束时开始。例如,我的结束日期是 2012 年 1 月 1 日晚上 8:00 - 我应该可以安排某人在 2012 年 1 月 1 日和晚上 8:00 开始。

需要一些帮助来思考这个问题。

4

1 回答 1

3

首先,不要Group用作列名。它是每个 SQL 标准中的保留字。grp为了我的回答,我将其重命名为。

试图安排一个新的转变,'2012-06-01 08:00''2012-06-03 08:00'...

INSERT INTO tbl (prim, grp, startdate, enddate)
SELECT 1, 10, '2012-06-01 08:00', '2012-06-03 08:00'
WHERE  NOT EXISTS (
    SELECT *
    FROM   tbl
    WHERE  prim = 1
    AND    grp = 10
    AND   '2012-06-03 08:00' > startdate -- not >= to allow sharing a border
    AND   '2012-06-01 08:00' < enddate   -- and not BETWEEN ... AND either
    )

请注意,我比较:

结束   > 旧开始
新开始<旧结束

如果您使用BETWEEN .. AND ..,则在测试中包含转变的边界。这与使用>=and相同<=。您需要使用>and<允许边界重叠。

好吧,试试我大大简化的语法。不知道你最初在那里有什么。
这是sqlfiddle.com 上的一个工作演示

于 2012-04-23T19:29:50.920 回答