我需要编写一个查询来从约会表中选择所有空闲插槽,但是编写这样复杂的查询时会遇到问题。也许有人可以帮助我,我会尝试解释我需要得到的东西。
我有表结构:
+---------------+----------+------+-----+---------+----------------+
| 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年...我尝试在PHP中执行此操作但是花了很长时间......