表中具有可用小时数的时间段(不是表中的时间段)


Time slot from table with available hours (not time slots in table)

PHP/MySQL SELECT

我有一张桌子,上面有会议室特定日期的可用时间。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年5月18日22       :02:00
22 12 2012年5月18日22                :02:00
22 13         2012年5月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(或类似(的选择来执行此操作?

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年5月18日22       :02:00
22 12 0           2012年5月18日22            :02:00
22 13      0           2012年5月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

选择"天"、"小时"表
其中插槽>=2 和Temp_Res<"2012-05-18 22:00:00">
按天、小时
分组

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

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(。

如果有人试图安排一个午夜的会议,这将不返回开放时间,但如果这是不希望的,你可以很容易地编写逻辑来适当地增加日期变量。