业务场景:某单位要组织考生考试,因为考场数量有限,一次考不完,需要分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
如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
具体的语句如:if not exists(select 1 from kaoshi_examination
where examPhyID=@要插入的考场ID and (examStartTime between @考试开始时间 and @考试结束时间+30分钟 --用时间函数,前一场考试时间结束后至少30分钟后才进行第二场考试
or examEndTime between @考试开始时间-30分钟 and @考试结束时间 --同样处理
))
--此处插入
else
--此处提示
*
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 )
关键字段 :
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)冲突
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)
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