获取字符串值作为时差的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之间,表格中的时间表也会重叠。