【问题标题】:Checking room availability检查房间可用性
【发布时间】:2013-03-06 10:08:08
【问题描述】:

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

【问题讨论】:

  • 上午 8:00 - 11:00 可用。
  • 小提示:您想知道开始时间和结束时间之间有哪个房间可用。
  • 你如何确定,一个房间是可用的还是被占用??
  • 我有一个数据库显示此时房间已占用,即上午 7:00-12:00NN,但是当我为该房间添加另一个事件时,即上午 8:00-上午 11:00,它说它可用。

标签: c# sql sql-server logic


【解决方案1】:

不确定,如果我正确理解您的意图,但如果您想检查@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

【讨论】:

  • 嘿,它有效,我是 sql 新手,我有很多事情要做。谢谢你的回答。
  • +1 用于考虑在请求的时段内结束的现有时间跨度的情况。如果我可以指向 BETWEEN 的话,我会投票两次 :)
  • Jan Darren Noroña:我很高兴它有帮助,请仔细看看 BETWEEN 如何处理边缘条件(当开始时间与其中一个参数完全相同时),如果这种方式处理符合您的意图)。顺便说一句,将答案标记为已接受,以便有相同问题的人看到解决方案。
  • @spender :我知道,我知道,但似乎 TS 对 SQL 来说还很新,在这种情况下 w3school 是一个非常好的实践资源来阅读。如果你没有一年的时间来学习 BETWEEN 的工作原理,你不能从关系代数开始 :)
【解决方案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

【讨论】:

    【解决方案3】:

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

    Starting_Time < @start AND Ending_Time > @start
    

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-23
      • 2016-08-12
      • 2019-07-16
      • 2012-06-03
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多