我在思考一个需求,比如用户打开某酒店的 app, 选择一个住店的时间范围,比如 2020-01-10 入住,2020-01-20 离店。
作为开发者,我很容易就能知道某个房间当前的状态,是有入住还是没有入住,但是如何根据一个时间段来判断呢?我如何判断 2020-01-10 —— 2020-01-20 这个时间段的房间剩余情况呢?
比如用户选定了 2020-01-10 —— 2020-01-20 这个时间段,现在有一件房A, 2020-01-10 —— 2020-01-19 是空房状态,但是 2020-01-20 这一天被人预定了,那么这间房A就不能够匹配用户所选择的这个时间段。
补充一:
不好意思,可能是我描述的不够清楚。设想这样一个场景:用户打开携程订酒店,根据入住时间和离店时间选择了一个区间,然后开始搜索,得到一个酒店列表。
问题1:假如我是携程后台,我这边有很多酒店,不止一家,我如何判断我的这些酒店,在用户选择的这个时间段内,哪些酒店是有房的,哪些是没房的,如果有房又有几间房(对于没房的,就没有必要显示出来了)
问题2:用户根据得到的酒店列表,选择了其中一家酒店,这个时候会向用户展示该酒店的房型。此时时间区间是已知的,我如何确定该酒店的某个房型在这个时间段内是有房的,又剩余几件房?
这种排班、排房间、排资源,等等的业务逻辑都是一样的,就是空间换时间,也就是建立一个以房间-时间片为关系的表
比如说你预订了2020-2-10~2020-2-20的1234房间,那么产生
1234 2020-2-10
1234 2020-2-11
...
1234 2020-2-20
这么10条记录。
这样你查询的话,只要查有没有你时间段内已经预订的记录就可以了。
因为预订只涉及今天到未来很短一段时间(比如30天或者90天),所以你每天写一个作业,将今天以前的记录删除就可以保持很高的性能了。
建一张预定表
预定表( 预定单号,房间号 ,开始时间 ,结束时间)
查询的时候只要判断两个时间是否有交集就行了,判断有交集情况复杂,所有选择判断没有交集,然后取非
比如
select from
预定表
where
id='A' and not(开始时间 > 2020-02-20 or 结束时间 < 2020-01-10))
如果查询结果为空,说明2020-01-10 —— 2020-01-20 这个时间段