PHP / MySQL SELECT
我有一张桌子,其中包含会议室特定日期的可用时间。 Temp_Res获取预订正在进行的时间戳(锁定这些行)。如果要预约的会议是2小时,我想获得每个可能的时间段。
Day Hour 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中执行此操作(如果可能),必须有一种查看表中其他行的方法,以确定是否包含特定行。
否则我必须通过以下方式解决:
a)创建一个额外的时隙表
b)有一个额外的列说明该特定行的最大时隙,见下文。
Day Hour Slot 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
选择日,小时FROM表
WHERE Slot> = 2 AND Temp_Res<“2012-05-18 22:00:00”
按天,小时分组
答案 0 :(得分: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)。
如果有人试图安排一个会在午夜举行的会议,这将不会返回开放时间,但如果这是不希望的,您可以轻松编写逻辑来适当增加日期变量。