给定的开始时间为 3:00 AM 给定的EndTime是 5:00 AM
// 3am |----------------------------| 5am
///这四个条件不应匹配, 这四个部分在给定范围内
// 3:30am |-------------| 4:30am
// 2am|---------------|4am
// 3:45am|----------------------|6am
// 1am|-------------------------------------------------|7am
以前我做的是
"starttime": {"$gte": starttime, "$lte": endtime},
"endtime": {"$gte": starttime, "$lte": endtime},
在mongo查询中查找现有插槽。 如果查询给出结果,则我不插入插槽并给出该插槽不可用的响应。
答案 0 :(得分:0)
基本上,您想检查给定时间范围内是否存在任何冲突。您有一个参考范围(凌晨3点至凌晨5点)以及与之相关的不同情况。
这是解决问题的一种非常幼稚的方法:
# for the sake of simplicity I use just numbers in the example
reference = (3, 5)
case_a = (3.5, 4.5)
case_b = (2, 4)
case_c = (3.75, 6)
case_d = (1, 7)
def check_for_conflicts(reference, case):
if case[0] > reference[0] and case[0] < reference[1] \
or case[1] > reference[0] and case[1] < reference[1] \
or case[0] < reference[0] and case[1] > reference[1]:
return True
return False
if条件中有3行,第一行检查起始点是否在参考范围内,第二行检查结束点在参考范围内,第三行检查参考范围是否在给定情况下。 / p>
我不知道这如何转换为MongoDB查询。我认为有一些Python库可以用更优雅的代码解决问题。
答案 1 :(得分:0)
更新:
新解决方案:完美的解决方案逻辑:(Max(StartA,StartB)<= Min(EndA,EndB)
旧解决方案:
如果您要查找给定的插槽已被填充
st = timstamp中的给定启动时间 et = timstamp中的给定时间
db.getCollection('exam').find({
$or : [
{
$and : [
{"startTimeStamp": {"$gte": st, "$gte":et },
{"endTimeStamp": {"$gte": st, "$gte":et }}
]
},
{
$and : [
{"startTimeStamp": {"$lte": st, "$lte": et }},
{"endTimeStamp": {"$lte": st, "$lte": et}}
]
}
]
})
explaination
:
例如:
endTimeStamp = 5:00 AM(已经创建并存储在数据库中)
givenStartTimeStamp( st )= 2:00 AM(我们要存储在数据库中)
如下所述:
3am |------------------| 5am
2am|---------------|4am
因此它不应该插入db,因为如果现在插入它,那么当我们提取它时,会在一段时间内提供多个数据。
所以我首先检查了我做的事情,条件是st和et比startTimestamp好,并且endtime比st和et好, 然后在另一个条件中检查两个时间是否都小于startTime和Endtime,
因此,如果数据不好,则整个条件变为假,否则任何一个条件变为True。
[注意:它可以解决所有四个条件。]
更新 :(较短的解决方案)
(Max(StartA, StartB) <= Min(EndA, EndB)