我目前正在使用C#开发一个简单的注册系统,我想是否有一种直接的方法可以检查输入会话的某个时间范围(From - To)是否与数据库中的时间范围相交。
方案如下:
我的数据库中有一个名为tblSessionList
的表,它存储每个主题的不同会话,如果特定Room
在特定时间内已被占用,我希望每次用户添加新会话时进行检查范围。从技术上讲,我想检查所选时间范围是否与tblSessionList
中的会话冲突。
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。我为此编写一个脏代码道歉,这是我的第一个系统。
非常感谢任何帮助。
答案 0 :(得分:0)
您可以使用interval tree搜索数据库。区间树存储范围(a,b)并使用两个间隔之间的比较从中构建BST并确定它是向左还是向右。间隔树上的搜索可以在O(logn)中完成。