如何检查两个时间戳是否部分地介于python中给定的两个时间戳之间

时间:2019-10-11 05:49:24

标签: python django mongodb time

给定的开始时间为 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查询中

查找现有插槽。 如果查询给出结果,则我不插入插槽并给出该插槽不可用的响应。

2 个答案:

答案 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

例如:

  • startTimeStamp = 3:00 AM(已创建并存储在数据库中)
  • endTimeStamp = 5:00 AM(已经创建并存储在数据库中)

  • givenStartTimeStamp( st )= 2:00 AM(我们要存储在数据库中)

  • givenEndTimeStamp( et )= 4:00 AM(我们要存储在数据库中)

如下所述:

        3am |------------------| 5am


 2am|---------------|4am

因此它不应该插入db,因为如果现在插入它,那么当我们提取它时,会在一段时间内提供多个数据。

所以我首先检查了我做的事情,条件是st和et比startTimestamp好,并且endtime比st和et好, 然后在另一个条件中检查两个时间是否都小于startTime和Endtime,

因此,如果数据不好,则整个条件变为假,否则任何一个条件变为True。

[注意:它可以解决所有四个条件。]

更新 :(较短的解决方案)

(Max(StartA, StartB) <= Min(EndA, EndB)