如何从预约表中找到空闲时间段

时间:2016-01-29 16:36:30

标签: mysql sql

我尝试使用AvailableTimeTable和AppointmentTable列出空闲时间段。我的项目中已经有了AppointmentTable,但我正在考虑添加AvailableTimeTable以便能够列出特定用户的空闲时间段。

AvailableTimeTable(TAVT)

Id
Day (0 to 6)
Start time
End time

AppointmentTable(TAP)

Id 
Start datetime
End datetime

AvailableTimeTable的数据示例 - 2016年3月7日星期一 - 这是用户1在星期一可用的时间块

Id            day        start      end
1             1             08:00     10:00
2             1             10:15     12:00                         (15 min break here)
3             1             13:00     14:00  
4             1             14:15     16:00                         (15 min break here)

AppointmentTable的数据示例 - 这是2016年3月7日星期一的用户1的时间表

Id            Start datetime               End datetime
1             2016-03-07-09:00             2016-03-07-10:00         (9-10 am)
2             2016-03-07-10:15             2016-03-07-11:00         (10:15-11am)

根据上述数据,当天(对于user1)的空闲时段为:

08:00 – 09:00
11:00 – 12:00
13:00 – 14:00
14:15 – 16:00

时间间隔始终为15分钟的倍数

不确定查询的外观。我甚至不确定我的AvailableTimeTable概念是否合适。也许它应该代表相反的,存储用户不可用的时间块。也许查询会更简单?

1 个答案:

答案 0 :(得分:-1)

你可以从这里开始:

SELECT CASE
         WHEN time(ap.start) = av.start or time(ap.end) < av.end THEN time(ap.end)
         WHEN time(ap.start) > av.start or time(ap.end) = av.end THEN av.start
         ELSE av.start
       END available_start_time
     , CASE
         WHEN time(ap.start) = av.start or time(ap.end) < av.end THEN av.end
         WHEN time(ap.start) > av.start or time(ap.end) = av.end THEN time(ap.start)
         ELSE av.end
       END available_end_time
  FROM AvailableTimeTable av
    LEFT JOIN AppointmentTable ap
      ON date(ap.start) = :p_date
        AND weekday(ap.start)+1 = av.day
        AND time(ap.start) between av.start and av.end
        AND time(ap.end) between av.start and av.end

这将仅涵盖基本和受约束的情况(每个可用时间行最多2个约会)。 你能预约15分钟吗? 你有相邻的约会吗? 我认为最好将可用时间存储在15分钟的块中。 否则,您应该运行游标以合并相邻的约会,然后查找可用的时间块。