检查时间范围是否在C#中相交

时间:2014-06-18 02:58:10

标签: c# .net winforms algorithm visual-studio-2012

我目前正在使用C#开发一个简单的注册系统,我想是否有一种直接的方法可以检查输入会话的某个时间范围(From - To)是否与数据库中的时间范围相交。

方案如下:

我的数据库中有一个名为tblSessionList的表,它存储每个主题的不同会话,如果特定Room在特定时间内已被占用,我希望每次用户添加新会话时进行检查范围。从技术上讲,我想检查所选时间范围是否与tblSessionList中的会话冲突。

Add Session Form

tblSessionList

 | Subject Code |   Venue    |   Room   |        Date             |  From   |   To    |
 |              |            |          |                         |         |         |
 |   CRGOV401   |  GT Tower  | Room 3D  | Thursday, June 19, 2014 | 8:00 AM |10:00 AM |
 |   CRGOV401   |  GT Tower  | Room 59  | Sunday, June 29, 2014   | 1:00 PM |3:00  PM |
 |   GNBNK201   | Main Plaza | HR Hall  | Monday, June 30, 2014   | 9:00 AM |11:00 AM |
 |   GNBNK201   | Main Plaza | HR Hall  | Monday, June 30, 2014   | 1:00 PM |3:00     |

我尝试过以下操作:

 private void btnAddSession_Click(object sender, EventArgs e)
    {
        bool proceedCopy = true;

        DataTable timeHolder = new DataTable();
        SqlDataAdapter selectTime = new SqlDataAdapter("select [From],[To] from tblSessionList where [Venue] = @venue and [Room] = @room", Connection.conn);
        selectTime.SelectCommand.Parameters.AddWithValue("@venue", venue.Text);
        selectTime.SelectCommand.Parameters.AddWithValue("@room", room.Text);

        selectTime.Fill(timeHolder);


        for(int i = 0; i < timeHolder.Rows.Count; i++)
       {

        if(timeHolder[i][0].toString() == From.Text) //checks if the 'From' of the query is the same with the 'From' of the new entry
              {
                MessageBox.Show("The room is already occupied on that time range");
                proceedCopy = false;
                break;
              }

        else if(timeHolder[i][1].toString() == To.Text) //checks if the 'To' of the query is the same with the 'To' of the new entry.
              {
                 MessageBox.Show("The room is already occupied on that time range");
                 proceedCopy = false;
                 break;
              }
        }
       if(proceedCopy == true)
           //insert code to insert new session to database here
    }

这是一个硬编码检查,它只检查时间范围的终点,而不是时间范围本身。我在想C#中是否有一个函数可以像Time一样使用而不是DateTime。

注意:我的数据库中的每一列都是varchar。我为此编写一个脏代码道歉,这是我的第一个系统。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用interval tree搜索数据库。区间树存储范围(a,b)并使用两个间隔之间的比较从中构建BST并确定它是向左还是向右。间隔树上的搜索可以在O(logn)中完成。