我需要一个rails/mysql查询来查找那些有给定时间段的诊所
clinic.rb
has_many :appointments
id | name
1 | Clinic A
2 | Clinic B
appointments
belongs_to :clinic
clinic_id | start_time | end_time | user_id
1 | 20 Jan 2016 12:00| 20 Jan 2016 13:00| 1
2 | 20 Jan 2016 13:00| 20 Jan 2016 14:00| 1
2 | 20 Jan 2016 16:00| 20 Jan 2016 18:00| 1
1 | 20 Jan 2016 15:00| 20 Jan 2016 18:00| 1
现在用户将给出一个时间段,比如 2016 年 1 月 20 日 13:00 到 13:30
在该时间段内,我需要找到在该时间内免费的诊所 B诊所的预约时间为13:00至14:00,因此无法使用 诊所 A 没有任何预约,因此它会给我该数据
同样,如果用户选择 11:00 - 11:30,他将同时获得 A 和 B
因此给定一个时间范围,我需要找出在该时间内哪个诊所(如果有)是免费的
最佳答案
您应该使用范围重叠逻辑来解决这个问题。您可以在这里找到很好的解释
Determine Whether Two Date Ranges Overlap
<强> SQL Fiddle Demo
SELECT c.*, a.*
FROM clinic c
LEFT JOIN appoinment a
ON c.`id` = a.`clinic_id`
AND `start_time` < '2016-01-20 13:30:00'
AND `end_time` > '2016-01-20 13:00:00'
WHERE `start_time` IS NULL;
SELECT c.*, a.*
FROM clinic c
LEFT JOIN appoinment a
ON c.`id` = a.`clinic_id`
AND `start_time` < '2016-01-20 11:30:00'
AND `end_time` > '2016-01-20 11:00:00'
WHERE `start_time` IS NULL;
如果您的日期与任何约会重叠,您将有一个匹配的加入。否则,时间段空闲,您将得到 NULL
关于mysql - 需要寻找有指定时段的免费诊所,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34885520/