如果用户在上午7:00-12:00NN在该房间添加事件,则代码如下。所以它当时应该不可用,但我的代码只读取开始时间和结束时间,任何建议?
public bool checkSched(string start, string endtime, string room, string day)
{
myCon.Open();
SqlDataReader dr;
bool found = false;
SqlCommand cmd = new SqlCommand("SELECT * FROM Subject WHERE (Starting_Time=@start OR Ending_Time = @endtime) AND (Room = @room) AND (Day=@day)", myCon);
cmd.Parameters.Add("@start", SqlDbType.NVarChar).Value = start;
cmd.Parameters.Add("@room", SqlDbType.NVarChar).Value = room;
cmd.Parameters.Add("@day", SqlDbType.NVarChar).Value = day;
cmd.Parameters.Add("@endtime", SqlDbType.NVarChar).Value = endtime;
dr = cmd.ExecuteReader();
found = dr.HasRows;
myCon.Close();
return found;
}
答案 0 :(得分:3)
不确定,如果我正确地表达了您的意图,但如果您想检查@start
和@endtime
之间是否有任何重叠事件,则应使用BETWEEN
:
SELECT * FROM Subject WHERE (
(Starting_Time BETWEEN @start AND @endtime)
OR
(Ending_Time BETWEEN @start AND @endtime)
) AND (Room = @room) AND (Day=@day)
请参阅BETWEEN
on MSDN了解BETWEEN
。
答案 1 :(得分:2)
首先,您需要将开始和结束时间的sql结果字符串转换为DateTime类型。
//start and end time from the room stored in the DB
DateTime startTimeDB;
DateTime endTimeDB;
DateTime.TryParse(dateString, out startTime)
DateTime.TryParse(dateString, out endTime)
请查看此链接以获取更多信息:MSDN DateTime.TryParse
您还在方法参数中使用字符串作为开始和结束时间,是否可以在那里使用DateTime类型?否则,您还需要将参数字符串解析为DateTime对象:
//start and end time for your new event
DateTime startTimeNew;
DateTime endTimeNew;
DateTime.TryParse(start, out startTimeNew)
DateTime.TryParse(endtime, out endTimeNew)
尝试这样的事后:
if (startTimeNew.Ticks > startTime.Ticks && endTimeNew.Ticks < endTime.Ticks)
{
return false;
}
return true
答案 2 :(得分:1)
你想要一个在开始时间和结束时间之间占用的房间。最简单的方法是检查开始时间是否在Starting_Time和Ending_Time之间。
Starting_Time < @start AND Ending_Time > @start
但那只是半职业。您还需要预订的房间,并在@start和@end(甚至更晚)之间结束。我想你可以找出额外的案例。
注意:在数据库中创建Starting_Time和Ending_Time日期。