系统就是这样。导师提供他们的可用性(周一至周日)以及他们当天(0700-1400)可用的时间范围(即:上午7点至下午2点)。
我正在尝试找出存储和搜索这些信息的最佳方式,以找到可用的导师。搜索只需要在每日系统上进行(即:星期几 - 星期一,星期二,星期三等)。
我的计划基础设施:
//Tutor Availability
---------------------------------------------------------------------------
tutorID | monday | tuesday | wednesday | thursday | friday |
---------------------------------------------------------------------------
27 | 0700-1200 | NULL | 1400-1800 | NULL | NULL |
---------------------------------------------------------------------------
35 | NULL | 1400-1600 | NULL | NULL | 1100-1900 |
//Scheduled tutor sessions
------------------------------------
tutorID | day | time |
------------------------------------
27 | monday | 0700-0900 |
------------------------------------
35 | friday | 1300-1500 |
查询:SELECT tutorid FROM tutoravailability WHERE 'monday'=
...在0900-1100之间可用,并且不在预定的导师会话中。
我一直在寻找如何在MySQL中搜索(并存储)这些时间间隔的方法。这是存储24小时工作日的最佳方式吗?甚至可以在这些间隔之间进行搜索吗?我是从错误的方式接近这个吗?任何见解都表示赞赏。
更新基础架构
//Tutor Availability
-----------------------------------------------------
tutorID | day | start_time | end_time | PK |
-----------------------------------------------------
27 | mon | 0700 | 1200 | 1 |
-----------------------------------------------------
27 | fri | 1400 | 1800 | 2 |
-----------------------------------------------------
35 | tue | 1100 | 1600 | 3 |
//Scheduled tutor sessions
--------------------------------------------------------
tutorID | day | start_time | end_time | PK |
--------------------------------------------------------
27 | mon | 0800 | 1000 | 1 |
--------------------------------------------------------
27 | fri | 1600 | 1800 | 2 |
因此,使用此系统,搜索可用时间会更加 更简单。但是,我仍然不知道如何比较预定课程的可用性以确保没有重叠。
SELECT tutorID
FROM tutoravailability WHERE day = 'fri'
AND start_time <= '1400'
AND end_time >= '1530'
现在我不明白如何将此查询与Scheduled tutor sessions
表进行比较,以避免重复预订。
最终更新
为了确保他们不与Scheduled Tutors会话重叠,我将使用MySQL BETWEEN
子句来搜索开始和结束时间。
答案 0 :(得分:4)
如果使用两列存储时间间隔,则使用sql查询执行搜索会更容易。
即。 tutorID,day,startTime,endTime
答案 1 :(得分:0)
您可以使用位标志来指示可用性(24位)和预定时间(24位)。然后,您可以使用24位来表示每天的可用小时数和预定小时数。
在Tutor Availability表中,假设'1'代表Available in,'0'代表不可用。在Scheduled表中,'0'代表Scheduled,'1'代表Unscheduled。
因此可用间隔0900-1100可以存储为POW(2,9)|战俘(2,10)| POW(2,11);预定的1000-1200可以存储为^(POW(2,10)| POW(2,12))
然后以下查询可以在星期一上午9点到11点之间提供导师的可用性:
SELECT ta.tutorid FROM tutoravailability ta, tutorscheduled ts
WHERE ta.tutorid = ts.tutorid AND ts.day = 'monday'
AND (ta.monday & ts.time & (POW(2,9) | POW(2,10) | POW(2,11))) = (POW(2,9) | POW(2,10) | POW(2,11))