2

系统就是这样。导师提供他们的可用性(周一 - 周日)和他们当天可用的时间范围(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表进行比较以避免重复预订。

最终更新

为确保它们与已安排的导师课程不重叠,我将使用 MySQLBETWEEN子句搜索开始和结束时间。

4

2 回答 2

4

如果您使用两列存储时间间隔,则使用 sql 查询执行搜索会容易得多。

即tutorID、day、startTime、endTime

于 2013-01-15T06:16:21.093 回答
0

您可以使用位标志来指示可用性(24 位)和计划时间(24 位)。然后您可以使用 24 位来表示每天的可用时间和预定时间。

在 Tutor Availability 表中,假设“1”代表可用,“0”代表不可用。在 Scheduled 表中,'0' 代表 Scheduled,'1' 代表 Unscheduled。

所以可用区间 0900-1100 可以存储为 POW(2,9) | 战俘(2,10) | 战俘(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))
于 2013-01-15T06:35:50.617 回答