这适用于(MS SQL Server 2008)它允许用户为其他用户安排开始和结束日期/时间而不会重叠。
我正在解决在日程安排期间无法重叠个人的业务规则。 E.G,如果用户1从2012年1月1日到2012年1月4日进行安排,则用户2应该无法提交1/2/2012至1/4/2012的请求。这部分已经处理好了,这是我的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))
我现在要求允许计划重叠,因为新班次可以在最后一班结束时开始。 E.G,我的结束日期是2012年1月1日晚上8点 - 我应该可以安排某人在2012年1月1日和晚上8点开始。
需要一些帮助来思考这个问题。
答案 0 :(得分: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
)
请注意我比较:
new_end > old_start new_start < old_end
如果您使用BETWEEN .. AND ..
,则在测试中包含班次的边框。它与使用>=
和<=
相同。您需要使用>
和<
来允许边框重叠。
好吧,试试我大大简化的语法。不确定你原来在那里有什么。
这是一个working demo on sqlfiddle.com来玩。