预约系统mysql查询

时间:2014-09-15 20:57:22

标签: mysql sql

我需要编写一个查询来从约会表中选择所有空闲插槽,但是编写这样复杂的查询时会遇到问题。也许有人可以帮助我,我会尝试解释我需要得到的东西。

我有表结构:

    +---------------+----------+------+-----+---------+----------------+
    | Field         | Type     | Null | Key | Default | Extra          |
    +---------------+----------+------+-----+---------+----------------+
    | id            | int(11)  | NO   | PRI | NULL    | auto_increment |
    | patient_id    | int(11)  | YES  | MUL | NULL    |                |
    | start_time    | datetime | NO   |     | NULL    |                |
    | end_time      | datetime | NO   |     | NULL    |                |
    +---------------+----------+------+-----+---------+----------------+

问题是我需要获得免费插槽。对于例如工程从上午8:00开始,到晚上8:00结束,从周一到周六。从最后一次预约免费空间应该提前1年。所以这是我期望的示例响应:

    +---------------------+---------------------+------------------+
    | Free Time Start     | Free Time End       | Free Time Length |
    +---------------------+---------------------+------------------+
    | 2014-09-15 08:00:00 | 2014-09-15 08:30:00 | 30               |
    | 2014-09-15 09:30:00 | 2014-09-15 12:00:00 | 150              |
    | 2014-09-15 15:00:00 | 2014-09-15 20:00:00 | 300              |
    | 2014-09-16 09:00:00 | 2014-09-16 11:30:00 | 150              |
    | 2014-09-16 13:00:00 | 2014-09-16 17:00:00 | 240              |
    | 2014-09-16 18:00:00 | 2015-09-16 18:00:00 | 525600           |
    +---------------------+---------------------+------------------+

以上结果的示例数据:

    +----+------------+---------------------+---------------------+
    | id | patient_id | start_time          | end_time            |
    +----+------------+---------------------+---------------------+
    |  1 |          1 | 2014-09-15 08:30:00 | 2014-09-15 09:30:00 |
    |  2 |          1 | 2014-09-15 12:00:00 | 2014-09-15 15:00:00 |
    |  3 |          1 | 2014-09-16 08:00:00 | 2014-09-16 09:00:00 |
    |  4 |          1 | 2014-09-16 11:30:00 | 2014-09-16 13:00:00 |
    |  5 |          1 | 2014-09-16 17:00:00 | 2014-09-16 18:00:00 |
    +----+------------+---------------------+---------------------+

所以在普通查询中应该:

  1. 获取免费空间08:00:00< = x< = 20:00:00并通过星期一至星期六(其他日子,应跳过小时)
  2. 最后一次预约后,免费时间范围应提前1年
  3. 很抱歉,如果存在类似的问题,我无法重复使用该解决方案进行小时/天偏移,提前1年...我尝试在PHP中执行此操作但是花了很长时间......

0 个答案:

没有答案