会议室预订系统,时间判断问题

时间:2022-04-08 02:52:30

我现在在做一个会议室的预定系统,用户会输入一个会议的开始时间和结束时间。如果在这个时间段会议室没有被预定,那么他就能够成功在这个时间段预定这个会议室,将它提交的内容插入数据库。否则预定不成功,提交数据不需要插入。

我想请问大家应该怎么来根据提交的数据和数据库对比,得到这个时间段是否有效?请帮忙指点,不胜感激!

譬如如果已经有人在8:00-10:00,以及15:30-17:30预定了一号会议室,那么如果在9:00-14:00就应该预定不成功,而在10:30-13:00应该还是可以预定成功的。

20 个解决方案

#1


希望大神能够写下代码,我是个小白,不怎么会

#2


告诉你一下思路吧。

假设你的时间段[x~y] 在跟一段已经使用了的时间段[a~b]冲突,那么就要满足条件
     (x>=a && x<=b) || (y>=a && y<=b)
或者使用 t-sql语言就是
    x between a and b or y between a and b

#3


嗯,不对!

#4


在上述判断条件的同时,还要  [a~b] 不在 [x~y]  之内,也就是 

     (x>=a && x<=b) || (y>=a && y<=b)  || (a>=x && a<=b && b>=x && b<=y)

或者说 
     x between a and b or y between a and b or (a between x and y and b bewteen y)

凡是符合此条件的,表示时间段 [x~y]跟已经预定的时间段有重叠部分,不能分配。

#5


假定:预订的时间为 A_Start 和 A_End,而数据库中存放的时间为 B_Start 和 B_End


则判断是否冲突的方法为
A_Start <= B_End And A_End > B_Start


即可

#6


这就是个初中数学题啊.. 会议室预订系统,时间判断问题

#7


参考这里(第5点,有SQL语句):
http://www.cnblogs.com/insus/archive/2011/08/27/2155286.html

#8


A_Start <= B_End And A_End > B_Start
这个条件根本不可能成立吧?

#9


应该是
A_End< B_Start  OR A_Start  > B_End
这是成立的条件

不成立的条件则是:
A_Start between B_Start and B_End
or
A_End between B_Start and B_End
or
A_Start<=B_Start and A_End>=B_End

#10


A_End< B_Start OR A_Start  > B_End
时间不冲突


A_Start between B_Start and B_End
or
A_End between B_Start and B_End
or
A_Start<=B_Start and A_End>=B_End
时间冲突

#11


不仅仅提交的时候要判断,首先用户在选择前,你就应该把可以选择的时间段罗列出来,前端也要做一次判断。

#12


你保存在数据库的内容是怎样的先??是不是StartDateTime(开始时间)一个字段、EndDateTime(结束时间)一个字段的??
如果是这样的话,那就简单得多了~~~你只需要取出预定日期内所有的EndDateTime(结束时间),然后循环这些取出的值与用户输入的开始时间做判断
仅当用户的开始时间大于取出的结束时间就表示该时间有效啊

#13


引用 9 楼 Z65443344 的回复:
应该是
A_End< B_Start  OR A_Start  > B_End
这是成立的条件

不成立的条件则是:
A_Start between B_Start and B_End
or
A_End between B_Start and B_End
or
A_Start<=B_Start and A_End>=B_End



还真得用And,而不是Or,你画个图就知道了,呵

反正当时我为了算这个东西,我把所有的可能都用线条画了一遍,最后得出这么个公式的。至少目前我用在正式系统上运行好几年了,没出现过啥问题

#14


引用 13 楼 jjkk168 的回复:
Quote: 引用 9 楼 Z65443344 的回复:

应该是
A_End< B_Start  OR A_Start  > B_End
这是成立的条件

不成立的条件则是:
A_Start between B_Start and B_End
or
A_End between B_Start and B_End
or
A_Start<=B_Start and A_End>=B_End



还真得用And,而不是Or,你画个图就知道了,呵

反正当时我为了算这个东西,我把所有的可能都用线条画了一遍,最后得出这么个公式的。至少目前我用在正式系统上运行好几年了,没出现过啥问题


无非是几种情况:
1. 左半交叉
2. 右半交叉
3. 全等
4. 全包含
5. 全部被包含

#15


这个还是要转成bool[1439]的数组处理才快!把分钟转成整数后,只需要判断连续空间内是否有true值即可。

#16


如果给我写的话,我首先要查询数据库里面当天的所有会议,如果没有会议,你这个时间肯定是没有问题的
如果有一条或者多条,就循环查询出来的会议,拿你的开始和结束时间,分别和每条会议的开始结束时间对比,只要有一条冲突就return
当然这是在不考虑从晚上23:00-第二天2:00这种情况的

#17


引用 15 楼 xuanbg 的回复:
这个还是要转成bool[1439]的数组处理才快!把分钟转成整数后,只需要判断连续空间内是否有true值即可。


感觉这个思路很不错, 我刚好在做ios的手机会议室预定APP,公司内部使用,我尝试一下这个思路。
 而且通常的预定都是整点或者半点开始,也就是说 Boolean[48] 就够了,感觉效率会很不错。

因为没有夸天的需求,所有的预定都在9点到17点之间,所以针对每一天:
1. 数据库里面,每一条预定实例,都有StartTime 和 EndTime。
2. 用户预定的时候,程序首先读出当天所有的预定记录,然后初始化数组Boolean[48] 。
3. 利用数组来初始化预定的时间选择界面,实现第一次验证,让用户无法选择无效的时间段。
4. 利用数组来判断客户输入的预定时间,在存入数据库的时候做第二次验证。

不知道这个思路有没有漏洞呢,试一试。



#18


1、用开始时间和所有已预订进行比较,如果在预定时间范围就不符合
2、用结束时间和所有已预订进行比较,如果在预定时间范围就不符合

#19


引用 17 楼 RoschComputer 的回复:
Quote: 引用 15 楼 xuanbg 的回复:

这个还是要转成bool[1439]的数组处理才快!把分钟转成整数后,只需要判断连续空间内是否有true值即可。


感觉这个思路很不错, 我刚好在做ios的手机会议室预定APP,公司内部使用,我尝试一下这个思路。
 而且通常的预定都是整点或者半点开始,也就是说 Boolean[48] 就够了,感觉效率会很不错。

因为没有夸天的需求,所有的预定都在9点到17点之间,所以针对每一天:
1. 数据库里面,每一条预定实例,都有StartTime 和 EndTime。
2. 用户预定的时候,程序首先读出当天所有的预定记录,然后初始化数组Boolean[48] 。
3. 利用数组来初始化预定的时间选择界面,实现第一次验证,让用户无法选择无效的时间段。
4. 利用数组来判断客户输入的预定时间,在存入数据库的时候做第二次验证。

不知道这个思路有没有漏洞呢,试一试。





你这样的需求的话,用户界面直接显示48个格子,标出对应的时间段。一开始都能点,点了的就反转bool值。被别人点过的就不能点,自己点过的可以点回去,这样操作也简单。

#20


我觉得只需要判断下,新预约的开始时间小于已经预约的结束时间,或者新预约结束时间大于已经预约的开始时间就够,如果一天多个,那就遍历挨个判断不就好

#1


希望大神能够写下代码,我是个小白,不怎么会

#2


告诉你一下思路吧。

假设你的时间段[x~y] 在跟一段已经使用了的时间段[a~b]冲突,那么就要满足条件
     (x>=a && x<=b) || (y>=a && y<=b)
或者使用 t-sql语言就是
    x between a and b or y between a and b

#3


嗯,不对!

#4


在上述判断条件的同时,还要  [a~b] 不在 [x~y]  之内,也就是 

     (x>=a && x<=b) || (y>=a && y<=b)  || (a>=x && a<=b && b>=x && b<=y)

或者说 
     x between a and b or y between a and b or (a between x and y and b bewteen y)

凡是符合此条件的,表示时间段 [x~y]跟已经预定的时间段有重叠部分,不能分配。

#5


假定:预订的时间为 A_Start 和 A_End,而数据库中存放的时间为 B_Start 和 B_End


则判断是否冲突的方法为
A_Start <= B_End And A_End > B_Start


即可

#6


这就是个初中数学题啊.. 会议室预订系统,时间判断问题

#7


参考这里(第5点,有SQL语句):
http://www.cnblogs.com/insus/archive/2011/08/27/2155286.html

#8


A_Start <= B_End And A_End > B_Start
这个条件根本不可能成立吧?

#9


应该是
A_End< B_Start  OR A_Start  > B_End
这是成立的条件

不成立的条件则是:
A_Start between B_Start and B_End
or
A_End between B_Start and B_End
or
A_Start<=B_Start and A_End>=B_End

#10


A_End< B_Start OR A_Start  > B_End
时间不冲突


A_Start between B_Start and B_End
or
A_End between B_Start and B_End
or
A_Start<=B_Start and A_End>=B_End
时间冲突

#11


不仅仅提交的时候要判断,首先用户在选择前,你就应该把可以选择的时间段罗列出来,前端也要做一次判断。

#12


你保存在数据库的内容是怎样的先??是不是StartDateTime(开始时间)一个字段、EndDateTime(结束时间)一个字段的??
如果是这样的话,那就简单得多了~~~你只需要取出预定日期内所有的EndDateTime(结束时间),然后循环这些取出的值与用户输入的开始时间做判断
仅当用户的开始时间大于取出的结束时间就表示该时间有效啊

#13


引用 9 楼 Z65443344 的回复:
应该是
A_End< B_Start  OR A_Start  > B_End
这是成立的条件

不成立的条件则是:
A_Start between B_Start and B_End
or
A_End between B_Start and B_End
or
A_Start<=B_Start and A_End>=B_End



还真得用And,而不是Or,你画个图就知道了,呵

反正当时我为了算这个东西,我把所有的可能都用线条画了一遍,最后得出这么个公式的。至少目前我用在正式系统上运行好几年了,没出现过啥问题

#14


引用 13 楼 jjkk168 的回复:
Quote: 引用 9 楼 Z65443344 的回复:

应该是
A_End< B_Start  OR A_Start  > B_End
这是成立的条件

不成立的条件则是:
A_Start between B_Start and B_End
or
A_End between B_Start and B_End
or
A_Start<=B_Start and A_End>=B_End



还真得用And,而不是Or,你画个图就知道了,呵

反正当时我为了算这个东西,我把所有的可能都用线条画了一遍,最后得出这么个公式的。至少目前我用在正式系统上运行好几年了,没出现过啥问题


无非是几种情况:
1. 左半交叉
2. 右半交叉
3. 全等
4. 全包含
5. 全部被包含

#15


这个还是要转成bool[1439]的数组处理才快!把分钟转成整数后,只需要判断连续空间内是否有true值即可。

#16


如果给我写的话,我首先要查询数据库里面当天的所有会议,如果没有会议,你这个时间肯定是没有问题的
如果有一条或者多条,就循环查询出来的会议,拿你的开始和结束时间,分别和每条会议的开始结束时间对比,只要有一条冲突就return
当然这是在不考虑从晚上23:00-第二天2:00这种情况的

#17


引用 15 楼 xuanbg 的回复:
这个还是要转成bool[1439]的数组处理才快!把分钟转成整数后,只需要判断连续空间内是否有true值即可。


感觉这个思路很不错, 我刚好在做ios的手机会议室预定APP,公司内部使用,我尝试一下这个思路。
 而且通常的预定都是整点或者半点开始,也就是说 Boolean[48] 就够了,感觉效率会很不错。

因为没有夸天的需求,所有的预定都在9点到17点之间,所以针对每一天:
1. 数据库里面,每一条预定实例,都有StartTime 和 EndTime。
2. 用户预定的时候,程序首先读出当天所有的预定记录,然后初始化数组Boolean[48] 。
3. 利用数组来初始化预定的时间选择界面,实现第一次验证,让用户无法选择无效的时间段。
4. 利用数组来判断客户输入的预定时间,在存入数据库的时候做第二次验证。

不知道这个思路有没有漏洞呢,试一试。



#18


1、用开始时间和所有已预订进行比较,如果在预定时间范围就不符合
2、用结束时间和所有已预订进行比较,如果在预定时间范围就不符合

#19


引用 17 楼 RoschComputer 的回复:
Quote: 引用 15 楼 xuanbg 的回复:

这个还是要转成bool[1439]的数组处理才快!把分钟转成整数后,只需要判断连续空间内是否有true值即可。


感觉这个思路很不错, 我刚好在做ios的手机会议室预定APP,公司内部使用,我尝试一下这个思路。
 而且通常的预定都是整点或者半点开始,也就是说 Boolean[48] 就够了,感觉效率会很不错。

因为没有夸天的需求,所有的预定都在9点到17点之间,所以针对每一天:
1. 数据库里面,每一条预定实例,都有StartTime 和 EndTime。
2. 用户预定的时候,程序首先读出当天所有的预定记录,然后初始化数组Boolean[48] 。
3. 利用数组来初始化预定的时间选择界面,实现第一次验证,让用户无法选择无效的时间段。
4. 利用数组来判断客户输入的预定时间,在存入数据库的时候做第二次验证。

不知道这个思路有没有漏洞呢,试一试。





你这样的需求的话,用户界面直接显示48个格子,标出对应的时间段。一开始都能点,点了的就反转bool值。被别人点过的就不能点,自己点过的可以点回去,这样操作也简单。

#20


我觉得只需要判断下,新预约的开始时间小于已经预约的结束时间,或者新预约结束时间大于已经预约的开始时间就够,如果一天多个,那就遍历挨个判断不就好

#21