MySQL / PHP - 查找可用的时间段

时间:2012-11-16 10:31:18

标签: php mysql datetime

针对类似主题提出了一些问题,但我无法找到解决此问题的方法,并感谢您的意见。

我正在使用预订引擎,用户可以在线预订某些服务。我坚持在特定的一天(或一周)内找到并显示可用的时间段。我知道所需时段的长度(例如1小时)和时间段可预订的营业时间(例如09:00-18:00h)。另外,我有一个MySQL表来存储已经存在的约会。与我的问题相关的列如下所示:

id  start (datetime)        end (datetime)
1   '2012-11-16 13:00:00'   '2012-11-16 14:30:00'
2   '2012-11-16 15:00:00'   '2012-11-16 16:00:00'
3   '2012-11-17 12:00:00'   '2012-11-16 15:45:00'
4   '2012-11-17 13:00:00'   '2012-11-16 16:15:00'
...

现在给出上面提到的信息,我无法找到一个好的解决方案(在MySQL或PHP中)来检索可用时隙列表。还有一个条件:时隙只能以季度步骤开始。 IE浏览器。对于上面的示例数据,16日可用的一小时时间段将是:
09:00,09:15,09:30,09:45,10:00,...,12:00,16:00,16:15,...,17:00。

请注意,即使可能存在重叠时间(如样本数据中),可用时隙也不会重叠
您认为最好的方法是什么?

1 个答案:

答案 0 :(得分:7)

SELECT a.end AS free_after
FROM bookings a
WHERE NOT EXISTS (
  SELECT 1
  FROM bookings b
  WHERE b.start BETWEEN a.end AND a.end + INTERVAL your_duration HOURS
)
AND a.end BETWEEN start_of_search_window AND end_of_search_window;

您只需提供your_duration(整数),start_of_search_window(日期时间)和end_of_search_window(日期时间)的值。

如果你想要花里胡哨......

SELECT free_from, free_until
FROM (
  SELECT a.end AS free_from,
  (SELECT MIN(c.start)
   FROM bookings c
   WHERE c.start > a.end) as free_until
  FROM bookings a
  WHERE NOT EXISTS (
    SELECT 1
    FROM bookings b
    WHERE b.start BETWEEN a.end AND a.end + INTERVAL your_duration HOUR
  )
  AND a.end BETWEEN start_of_search_window AND end_of_search_window
)
ORDER BY free_until-free_from
LIMIT 0,3;

将在窗口内为您提供三个最短的可用插槽(即最接近目标尺寸)。