业务场景:某单位要组织考生考试,因为考场数量有限,一次考不完,需要分N天进行考试,具体做法就是把物理的考场按时间进行划分
如A考场 上午 8到 10点考语文  ,下午 14-16点考数学。在重复建立物理考场的不同时间的使用过程中,如何判断考场的时间冲突,然后提示不能创建对应的考场呢?
冲突情况的定义 
 1、 8:30开始 与 8到10点间的考场冲突
 2、 6到11点  与 8到10点 时间冲突
 3、 新建一个 8-10点得考场,与已经存在的考场时间冲突
 4、12点到20点  与 14-16点冲突数据库表:  
kaoshi_examination   
关键字段 :
examStartTime   考场占用开始时间
examEndTime  考试占用结束时间
examPhyID :物理考场编号
examplaceID :逻辑考场编号 - 主键
CREATE TABLE [dbo].[kaoshi_examination] (
[examplaceID] int NOT NULL ,
[examSign] varchar(32) COLLATE Chinese_PRC_CI_AS NULL ,
[examName] varchar(64) COLLATE Chinese_PRC_CI_AS NULL ,
[examPlace] varchar(64) COLLATE Chinese_PRC_CI_AS NULL ,
[examCapacity] int NULL ,
[examTeacher] varchar(16) COLLATE Chinese_PRC_CI_AS NULL ,
[backcontent] varchar(256) COLLATE Chinese_PRC_CI_AS NULL ,
[areaplaceID] int NULL ,
[areaID] int NULL ,
[isStatus] smallint NULL ,
[examUseCount] int NULL ,
[examPlanID] int NULL ,
[examStartTime] datetime NULL ,
[examEndTime] datetime NULL ,
[examSubject] int NULL ,
[examSortID] int NULL ,
[examPhyID] int NULL ,
CONSTRAINT [PK_kaoshi_examination] PRIMARY KEY ([examplaceID])
)
ON [PRIMARY]
GO

解决方案 »

  1.   

    在向表中插入排考场数据时,对已有数据进行检查,如发现已存在物理考场号,且时间与新建入数据的时间相冲突时取消插入并提示.
    具体的语句如:if not exists(select 1 from kaoshi_examination
    where examPhyID=@要插入的考场ID and (examStartTime between @考试开始时间 and @考试结束时间+30分钟  --用时间函数,前一场考试时间结束后至少30分钟后才进行第二场考试
    or examEndTime between @考试开始时间-30分钟 and @考试结束时间   --同样处理
    ))
    --此处插入
    else
    --此处提示
      

  2.   

    完全没理解我的意思求一SQL判断以上时间冲突的情况。
      

  3.   

    SELECT
    *
    FROM
    kaoshi_examination a
    WHERE
    ( '2011-08-05 12:05:44.000' BETWEEN a.examStartTime
    AND a.examEndTime  AND a.examPhyID = 569)
    OR
    ('2011-08-05 21:30:44.000' BETWEEN a.examStartTime
    AND a.examEndTime  AND a.examPhyID = 569)
    OR 
    (
    ('2011-08-05 12:05:44.000' BETWEEN a.examStartTime
    AND a.examEndTime AND a.examPhyID = 569)
    AND ('2011-08-05 21:30:44.000' BETWEEN a.examStartTime
    AND a.examEndTime AND a.examPhyID = 569)
    )
    OR ('2011-08-05 12:05:44.000' <= a.examStartTime  AND a.examPhyID = 569
    AND '2011-08-05 21:30:44.000' >= a.examEndTime   AND a.examPhyID = 569    )
      

  4.   

    kaoshi_examination   
    关键字段 :
    examStartTime 考场占用开始时间
    examEndTime 考试占用结束时间
    examPhyID :物理考场编号
    examplaceID :逻辑考场编号 - 主键@btime  待创建考试场次的开始时间
    @etime  待创建考试场次的结束时间
    @exampid  待创建考试场次的物理考场编号if Exists(select * from kaoshi_examination  where (examStartTime between @btime and @etime or examEndTime between @btime and @etime ) and  examPhyID =@exampid)冲突
      

  5.   

    以下为逻辑代码。-- 判断一个时间是否在两个时间之间。=0时无冲突
    create function udf_timeInBetween(mytime, starttime, endtime)
    return int 
    as 
    if starttime < mytime and mytime < endtime
    return 1
    else 
    return 0-- 
    create function udf_validNewExam(myexamPhyID, mystarttime, myendtime)
    retun int
    as 
    declare @ok int
    -- 如果在同一物理考场,新的考试起始或终止时间有冲突,则>0. =0时无冲突
    select @ok = sum(dbo.udf_timeInBetween(mystarttime, [examStartTime], [examEndTime]) + sum(dbo.udf_timeInBetween(myendtime, [examStartTime], [examEndTime])
    from [kaoshi_examination]
    where [examPhyID] = myexamPhyIDreturn @ok-- 具体使用时调用以下即可
    select dbo.udf_validNewExam(myexamPhyID, mystarttime, myendtime)
      

  6.   

    -- 如果在同一物理考场,新的考试起始或终止时间有冲突,则>0. =0时无冲突
    select @ok = sum(dbo.udf_timeInBetween(mystarttime, [examStartTime], [examEndTime]) + sum(dbo.udf_timeInBetween(myendtime, [examStartTime], [examEndTime])
    from [kaoshi_examination]
    where [examPhyID] = myexamPhyID这个应该进一步判断,改为:select @ok = 
     sum(dbo.udf_timeInBetween(mystarttime, [examStartTime], [examEndTime]) )
    + sum(dbo.udf_timeInBetween(myendtime, [examStartTime], [examEndTime]) )
    + sum(dbo.udf_timeInBetween([examStartTime], mystarttime, myendtime) )
    + sum(dbo.udf_timeInBetween([examEndTime], mystarttime, myendtime) )
    from [kaoshi_examination]
    where [examPhyID] = myexamPhyID