-1

PHP/MySQL 选择

我有一张桌子,上面有特定日期的会议室可用时间。Temp_Res 获取正在进行预订时的时间戳(以锁定这些行)。如果要预订的会议时间为 2 小时,我想获得所有可能的时间段。

日 时 Temp_Res
22 8 0000-00-00 00:00:00
22 9 0000-00-00 00:00:00
22 10 0000-00-00 00:00:00
22 11 2012-05-18 22:02: 00
22 12 2012-05-18 22:02:00
22 13 2012-05-18 22:02:00
22 14 0000-00-00 00:00:00
22 15 0000-00-00 00:00:00
22 16 0000-00-00 00:00:00
22 17 0000-00-00 00:00:00

因此,如果需要的时间槽是 2 小时,则只有 8、9、14、15、16 小时是输出。(然后我会使用小时并添加 2 来获得插槽:8-10、9-11、14-16、15-17 和 16-18)
如果时间段是 3 小时,则只有 8、14、15 小时会是输出和插槽:8-11、14-17、15-18....等
为了能够在 SELECT 中执行此操作(如果可能),必须有一种方法可以查看表中的其他行以确定是否应包括特定行。

1. 是否可以查看其他行并使用带有 WHERE (或类似)的 SELECT 来执行此操作?

2. 如果可能的话,请你引导我走向正确的方向吗?

3. 其他解决方案/想法(以下除外)也非常感谢!

否则我必须通过以下方式解决它:
a)创建一个额外的时隙表
b)有一个额外的列来说明该特定行的最大时隙,见下文。

日时槽 Temp_Res
22 8 3 0000-00-00 00:00:00
22 9 2 0000-00-00 00:00:00
22 10 1 0000-00-00 00:00:00
22 11 0 2012-05- 18 22:02:00
22 12 0 2012-05-18 22:02:00
22 13 0 2012-05-18 22:02:00
22 14 4 0000-00-00 00:00:00
22 15 3 0000- 00-00 00:00:00
22 16 2 0000-00-00 00:00:00
22 17 1 0000-00-00 00:00:00

SELECT Day, Hour FROM table
WHERE Slot>=2 AND Temp_Res<"2012-05-18 22:00:00"
GROUP BY Day, Hour

4

1 回答 1

0

我建议使用开始时间和会议长度来计算结束时间,这相当于“需要空闲才能进行此预订的最后一小时”。然后,您可以使用内部联接仅选择开始时间,其中每小时到结束时间也未预订。对于四个小时的会议,您的查询可能如下所示:

SELECT start.day, start.hour from table as start 
INNER JOIN table as hour1
    ON ((hour1.hour = start.hour + 1) AND (hour1.TempRes = '0000-00-00 00:00:00'))
INNER JOIN table as hour2
    ON ((hour2.hour = start.hour + 2) AND (hour2.TempRes = '0000-00-00 00:00:00'))
INNER JOIN table as hour3
    ON ((hour2.hour = start.hour + 3) AND (hour3.TempRes = '0000-00-00 00:00:00'))
WHERE table.TempRes = '0000-00-00 00:00:00'

您可以在 PHP 中使用循环将所需数量的内部连接子句添加到查询文本中(并且因为您使用的是您自己计算的变量,所以您不必担心注入)。它将永远是(会议持续时间 - 1)。

如果有人试图安排一个将在午夜进行的会议,这将不返回任何开放时间,但如果这是不希望的,您可以轻松编写逻辑来适当地增加 day 变量。

于 2012-05-19T22:20:49.077 回答