SQL,在日期/时间之间进行选择

时间:2012-04-23 18:59:48

标签: sql sql-server-2008 date time between

这适用于(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点开始。

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

1 个答案:

答案 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来玩。