验证mysql行是否与另一行冲突

时间:2014-08-02 23:35:54

标签: php mysql datetime

我正在我所在的学校建立资源预订系统。资源仅保留40分钟(这是课程的持续时间)。

资源分为4类:

1-幼儿园

2-小学

三楼一楼

4-高中二楼


时间表分为不同的时间跨度:

1-托儿所

2- pre-kinder

3 kinder

<4-> 4-小学(1年级 - 3年级)

<5->小学(4年级 - 6年级)

6-高中(7年级 - 9年级)

7-高中(10年级及以上)

有时候,一年级到三年级的学生都在休息,四年级到六年级的学生都在上课。休息持续15分钟,课程40分钟。有时,如果允许用户保留资源,那么该计划会在另外一个用户使用该资源至少另外10分钟的时间表上存在冲突,preschoolelementaryhigh school

我的数据库预订表结构如下:

reservation table

我认为有两个字段可以帮助我确定预订是否会产生冲突:RESERVATIONDUEDATERESERVATIONEXPIREDATE这两个字段都是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

该查询旨在仅选择RESOURCEIDSCHEDULE_TYPE_ID,&#39; SCHEDULE_START&#39;和&#39; SCHEDULE_END&#39;与查询中提供的信息不同。

此时,我甚至不确定查询是否结构正确,因为此查询的结果是:

enter image description here

我真正想要的是这些属性与提供的属性不同的时间段。

1 个答案:

答案 0 :(得分:0)

我正试图了解你所需要的东西。试试这个...做一个类似于你做的搜索...

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?

此外,这是针对定期会话,如果是这样的话......您如何以时间戳格式在数据库中管理这个?