从约会表Postgresql Rails中查找免费预约空档

时间:2016-12-04 12:07:32

标签: ruby-on-rails postgresql

我在rails上有一个应用程序,其中包含属于Providers的约会,我希望创建一个查询,查找提供程序在约会中的差距约会存储为开始和结束两者都是日期时间。理想情况下,我会调用Provider.free_appointment_slots(length,start,finish),其中length是所需约会的长度,开始和结束是搜索的范围,即特定的一周或一天。

我认为它应该与这些有些相似...... How to return all the free periods of time from an appointment set Finding free blocks of time in mysql and php?

我有一个约会表,其数据如下:

ID    |       Start       |       Finish       | ProviderID
1       2016-11-12 09:00    2016-11-12 09:30        1
1       2016-11-12 10:00    2016-11-12 10:30        1
1       2016-11-12 11:30    2016-11-12 12:00        1

我希望能够提供搜索的开始和结束时间以及预约长度和我的查询返回可用的预约时间..例如,如果我正在寻找2016-11-12 08:30之间的约会和2016-11-12 12:30,预约时间30分钟

我会收到如下结果:

     Start       |     Finish
2016-11-12 08:30   2016-11-12 09:00
2016-11-12 09:30   2016-11-12 10:00
2016-11-12 10:30   2016-11-12 11:00
2016-11-12 11:00   2016-11-12 11:30
2016-11-12 12:00   2016-11-12 12:30

另一项重要功能是能够提供多个搜索周期,例如不同的日期

我希望这很明显,任何帮助都会非常感激

1 个答案:

答案 0 :(得分:0)

好的,所以我设法提出了一个sql查询,它给了我正确的结果,将它转换成rails会有一点点工作但它应该从这里开始一帆风顺

SELECT Available_from, Available_to
      FROM (
      SELECT @lasttime_to AS Available_from, start AS Available_to, @lasttime_to := finish
      FROM (SELECT start, finish
            FROM appointments
            WHERE finish >= '2013-11-12 08:29'
              AND start < '2016-11-12 13:01'
              AND provider_id = 1
             UNION ALL
           SELECT '2016-11-12 08:30', '2016-11-12 08:30'
             UNION ALL
           SELECT '2016-11-12 13:00', '2016-11-12 13:00'
                 ORDER BY time_from 

           ) e
      JOIN (SELECT @lasttime_to := NULL) init) x
      WHERE Available_to > DATE_ADD(Available_from, INTERVAL 15 MINUTE)