获取字符串值作为时差的Sql查询

获取字符串值作为时差的Sql查询,sql,sql-server,Sql,Sql Server,我对存储为字符串的时间有如下要求: ID - FromTime - ToTime - Day - RoomNo 1 - 10:00 AM - 11:00 AM - Sun - 202 2 - 11:00 AM - 12:00 AM - Sun - 203 所以我要做的是在表格中检查,一个房间在指定的时间内被分配了,就像如果一个房间是在太阳的上午10:00到11:00分配的,那么在指定的一天的那个时间,就没有其他的时间表了。它不能像上午10:20到11:00那样重

我对存储为字符串的时间有如下要求:

    ID - FromTime - ToTime - Day - RoomNo
      1 - 10:00 AM - 11:00 AM - Sun - 202
      2 - 11:00 AM - 12:00 AM - Sun - 203
所以我要做的是在表格中检查,一个房间在指定的时间内被分配了,就像如果一个房间是在太阳的上午10:00到11:00分配的,那么在指定的一天的那个时间,就没有其他的时间表了。它不能像上午10:20到11:00那样重叠。从上午10:00开始,已经有一个时间表。同样,我必须确保在特定的一天(太阳)的其他时间表,如上午11:00至12:00也可用。这只是进行验证所必需的

就是这样。我正在尝试用SQL查询来实现它,希望它会很简单。所以尝试了一个不够好的查询(只是为了演示):

选择*
从eRoom
哪里
转换(时间,FromTime)>=转换(时间,“上午10:00”)

和CONVERT(Time,ToTime)这是我们尝试实现的以下内容,几乎可以正常工作:

    string scheduleTime = "";
    bool found = false;

    foreach (AllocateRoom allocate in allocatedRooms)
    {
        DateTime existingFromTime = Convert.ToDateTime(allocate.FromTime);
        DateTime existingToTime = Convert.ToDateTime(allocate.ToTime);

        bool matchRoom = allocate.RoomNo == aAllocateRoom.RoomNo;
        bool matchDay = allocate.Day == aAllocateRoom.Day;

        bool matchFromTime = existingFromTime == nFromTime;
        bool matchToTime = existingToTime == nToTime;

        bool coverExistingRange = nFromTime < existingFromTime & nToTime > existingFromTime;
        bool coverExistingRange2 = nFromTime < existingToTime & nToTime > existingToTime;

        bool toTimeInTheRange = nToTime > existingFromTime & nToTime < existingToTime;
        bool fromTimeInTheRange = nFromTime > existingFromTime & nFromTime < existingToTime;

        bool matchTime = matchFromTime || matchToTime;
        bool coverTime = coverExistingRange || coverExistingRange2;
        bool overlapTime = toTimeInTheRange || fromTimeInTheRange;

        if (matchRoom & matchDay & (matchTime || overlapTime || coverTime))
        {
            scheduleTime = "Room " + allocate.RoomNo + " - " + allocate.Day + " " + allocate.FromTime + " - " + allocate.ToTime;
            found = true;
        }
    }

    if (found)
    {
        message = scheduleTime + " has been already scheduled!";
        return message;
    }
string scheduleTime=”“;
bool-found=false;
foreach(AllocateeRoom在allocatedRooms中分配)
{
DateTime existingFromTime=Convert.ToDateTime(allocate.FromTime);
DateTime existingToTime=Convert.ToDateTime(allocate.ToTime);
bool matchRoom=allocate.RoomNo==aaallocateroom.RoomNo;
bool matchDay=allocate.Day==aaallocateroom.Day;
bool matchFromTime=existingFromTime==nFromTime;
bool matchToTime=existingToTime==nToTime;
bool coverExistingRange=nFromTimeexistingFromTime;
bool cover existingrange 2=nFromTimeexistingToTime;
bool totimeintrange=nToTime>existingFromTime&nToTimeexistingFromTime&nFromTime
我们尝试实现了以下功能,并且几乎可以正常工作:

    string scheduleTime = "";
    bool found = false;

    foreach (AllocateRoom allocate in allocatedRooms)
    {
        DateTime existingFromTime = Convert.ToDateTime(allocate.FromTime);
        DateTime existingToTime = Convert.ToDateTime(allocate.ToTime);

        bool matchRoom = allocate.RoomNo == aAllocateRoom.RoomNo;
        bool matchDay = allocate.Day == aAllocateRoom.Day;

        bool matchFromTime = existingFromTime == nFromTime;
        bool matchToTime = existingToTime == nToTime;

        bool coverExistingRange = nFromTime < existingFromTime & nToTime > existingFromTime;
        bool coverExistingRange2 = nFromTime < existingToTime & nToTime > existingToTime;

        bool toTimeInTheRange = nToTime > existingFromTime & nToTime < existingToTime;
        bool fromTimeInTheRange = nFromTime > existingFromTime & nFromTime < existingToTime;

        bool matchTime = matchFromTime || matchToTime;
        bool coverTime = coverExistingRange || coverExistingRange2;
        bool overlapTime = toTimeInTheRange || fromTimeInTheRange;

        if (matchRoom & matchDay & (matchTime || overlapTime || coverTime))
        {
            scheduleTime = "Room " + allocate.RoomNo + " - " + allocate.Day + " " + allocate.FromTime + " - " + allocate.ToTime;
            found = true;
        }
    }

    if (found)
    {
        message = scheduleTime + " has been already scheduled!";
        return message;
    }
string scheduleTime=”“;
bool-found=false;
foreach(AllocateeRoom在allocatedRooms中分配)
{
DateTime existingFromTime=Convert.ToDateTime(allocate.FromTime);
DateTime existingToTime=Convert.ToDateTime(allocate.ToTime);
bool matchRoom=allocate.RoomNo==aaallocateroom.RoomNo;
bool matchDay=allocate.Day==aaallocateroom.Day;
bool matchFromTime=existingFromTime==nFromTime;
bool matchToTime=existingToTime==nToTime;
bool coverExistingRange=nFromTimeexistingFromTime;
bool cover existingrange 2=nFromTimeexistingToTime;
bool totimeintrange=nToTime>existingFromTime&nToTimeexistingFromTime&nFromTime
MS SQL Server 2008(及更高版本)允许此转换。您尝试的查询有什么问题?当范围超过午夜时,您会遇到问题。你必须在逻辑上使用星期几。然后,当然,你仍然有星期六到星期日考虑当周开始。您存储了多少天的数据?关于重叠范围的问题:您也可以找到关于该主题的许多其他页面。上述查询仅适用于一个示例:上午10:00到11:00。但它不检查上午10:01到11:00。即使在上午10:00到上午11:00之间的时间安排在表中,它也会重叠。MS SQL Server 2008(及更新版本)允许此转换。您尝试的查询有什么问题?当范围超过午夜时,您会遇到问题。你必须在逻辑上使用星期几。然后,当然,你仍然有星期六到星期日考虑当周开始。您存储了多少天的数据?关于重叠范围的问题:您也可以找到关于该主题的许多其他页面。上述查询仅适用于一个示例:上午10:00到11:00。但它不检查上午10:01到11:00。即使在上午10:00到11:00之间,表格中的时间表也会重叠。