MySQL搜索时间间隔

时间:2013-01-15 06:00:32

标签: php mysql

系统就是这样。导师提供他们的可用性(周一至周日)以及他们当天(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子句来搜索开始和结束时间。

2 个答案:

答案 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))