mysql - 需要寻找有指定时段的免费诊所

标签 mysql ruby-on-rails

我需要一个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/

相关文章:

mysql - 来自子查询的组连接非常慢

mysql - Zend_Db_Table、JOIN 和 mysql 表达式在一个查询中?

MySQL:子查询:无输出

ruby-on-rails - 有没有办法使用 postgresql 函数来计算 Rails 中的加权平均值?

ruby-on-rails - 奇怪的 Rails 迁移/schema.rb 问题

ruby-on-rails - Rails 3.1 compass 和链轮。使困惑

ruby-on-rails - Rails - 文本不适合我的布局

php - 登录表单小错误

php - SSH 隧道 - MySQL 服务器已消失

ruby-on-rails - Assets :Precompile too verbose