В настоящее время я разрабатываю простую систему регистрации на С#, и я думаю, что есть простой способ проверить, пересекается ли определенный временной диапазон (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
}
Это жестко запрограммированная проверка, и это проверяет только конечные точки временного диапазона, а не сам временной диапазон. Я думаю, если есть функция в С#, которую я мог бы использовать как Time, а не DateTime.
Примечание. Каждый столбец в моей базе данных является varchar. Мои извинения за наличие грязного кода для этого - моя первая система.
Любая помощь приветствуется.
Вы можете использовать дерево интервалов для поиска в базе данных. Дерево интервалов хранит диапазон (a, b) и строит BST из него с использованием сравнения между двумя интервалами и решает, идет ли он влево или вправо. Поиск по дереву интервалов может быть выполнен в O (logn).