我正在为我工作的学校做一个资源预留系统。资源只预留40分钟(这就是类(class)的持续时间)。
资源分为 4 类:
1-学前类
2- 初级
3- 高中,一楼
4- 高中二楼
<小时/>时间表分为不同的时间跨度:
1- 托儿所
2-学前类
3-更友善
4-小学(一年级 - 三年级)
5-小学(四年级 - 六年级)
6-高中(7年级 - 9年级)
7- 高中(10 年级及以上)
有时,会出现一年级到三年级学生在课间休息,而四年级到六年级学生在类里面的情况。课间休息15分钟,上课40分钟。有时,时间表上会存在冲突,如果允许用户预订资源,则该资源将被其他用户使用至少 10 分钟,这种情况发生在 学前类
、小学
和高中
。
我的DB预留表结构如下:
我认为有两个字段可以帮助我确定预订是否会产生冲突:RESERVATIONDUEDATE
和 RESERVATIONEXPIREDATE
,它们都是 datetime
并拥有我需要的信息。我无法想象如何进行查询来验证是否会发生冲突。
到目前为止,我的查询函数如下所示:
SELECT T1.SCHEDULE_START, T1.SCHEDULE_END
FROM reservation T4
JOIN schedule_intermediate T1 ON T4.SCHEDULEID_GENERATED = T1.SCHEDULEID_GENERATED
JOIN schedule_type T2 ON T1.SCHEDULE_TYPE_ID = T2.SCHEDULE_TYPE_ID
JOIN schedule T3 ON T1.SCHEDULEID = T3.SCHEDULEID
WHERE (
SELECT COUNT( * )
FROM reservation R
INNER JOIN schedule_intermediate SI ON R.SCHEDULEID_GENERATED = SI.SCHEDULEID_GENERATED
WHERE R.RESOURCEID =456
AND SI.SCHEDULE_TYPE_ID =4
AND R.RESERVATIONDUEDATE != '2014-08-06 07:35:00'
AND R.RESERVATIONEXPIREDATE != '2014-08-06 08:35:00'
AND(( SI.SCHEDULE_START < T1.SCHEDULE_START AND SI.SCHEDULE_END > T1.SCHEDULE_START )
OR ( SI.SCHEDULE_START < T1.SCHEDULE_END AND SI.SCHEDULE_END > T1.SCHEDULE_END ))
) = 0
该查询打算仅选择 RESOURCEID
、SCHEDULE_TYPE_ID
、“SCHEDULE_START”和“SCHEDULE_END”与提供的信息不同的可用计划时间段在查询中。
此时,我什至不确定查询的结构是否正确,因为该查询的结果是:
我真正想要的是这些属性与所提供的属性不同的时间段。
最佳答案
我正在努力了解您的需求。试试这个...进行与您所做的类似的搜索...
WHERE R.RESOURCEID =456
AND SI.SCHEDULE_TYPE_ID =4
AND R.RESERVATIONDUEDATE >= '2014-08-06 07:35:00'
AND R.RESERVATIONEXPIREDATE <= '2014-08-06 08:35:00'
如果您的查询返回 0 行,则不会发生冲突。
目前,您的查询返回该行,因为 Schedule_Start 是 07:50,不等于 07:35:00?
此外,这是否用于重复 session ,如果是,您如何以时间戳格式在数据库中管理它?
关于php - 验证 mysql 行是否与另一行冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100314/