1

如果用户在上午 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;
}
4

3 回答 3

3

不确定,如果我正确理解了您的意图,但是如果您想检查 and 之间是否有任何事件重叠@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)

请参阅BETWEENMSDN了解BETWEEN

于 2013-03-06T10:22:40.093 回答
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
于 2013-03-06T10:32:52.510 回答
1

您想要一个在开始时间和结束时间之间占用的房间。最简单的方法是检查开始时间是否在任何 Starting_Time 和 Ending_Time 之间。

Starting_Time < @start AND Ending_Time > @start

但这只是一半的工作。您还想要在@start 和@end(甚至更晚)之间预订并结束的房间。我想你可以找出额外的情况。

注意:在您的数据库中设置 Starting_Time 和 Ending_Time 日期。

于 2013-03-06T10:21:28.160 回答