【问题标题】:how to check if two timestamps partially comes between given two timestamps in python如何检查两个时间戳是否部分位于python中给定的两个时间戳之间
【发布时间】:2019-10-11 05:49:24
【问题描述】:

假设 startTime 是 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 查询中查找检查现有插槽。 如果查询给出结果,那么我不插入插槽并给出该插槽不可用的响应。

【问题讨论】:

  • “这四个条件不应该匹配” - 你的意思是上面的例子都不应该匹配吗?
  • 是的,这些不应该匹配,因为这些槽已经分配给用户,我们可以为另一个用户添加另一个部分时间。
  • 部分在范围内是什么意思?在问题中,凌晨 3.30 到 4.30 在范围内,对吗?
  • 使用一些常识 Lucia。为什么我要在凌晨 3:30 到凌晨 4:30 分配已填满的插槽 3 到 5。
  • 不清楚在什么情况下你需要这个。作为检查数据库的查询?当有两个日期范围时作为 python 代码?

标签: python django mongodb time


【解决方案1】:

基本上,您想检查给定时间范围内是否存在任何冲突。您有一个参考范围(凌晨 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 行,第一行检查开始是否在参考范围内,第二行检查结束是否在参考范围内,第三行检查参考范围是否包含在给定的 case 内。

我不知道这如何转化为 MongoDB 查询。我认为有 Python 库可以用更优雅的代码解决问题。

【讨论】:

  • 感谢您的努力。您的逻辑是正确的,顺便说一句,我找到了解决方案。
  • @KAUSHALKORADIYA 很高兴您找到了解决方案。请发布您的解决方案作为答案,其他用户将不胜感激。
  • 您只需要检查 (case[0] = reference[0]) 即可确定两个范围重叠。见here
  • 不,通过放置值来检查不同的条件是行不通的。
  • @dirkgroten 感谢您的评论!是的,确实,这应该可以正常工作,而且更加优雅。
【解决方案2】:

更新

新解:完美解逻辑:(Max(StartA, StartB)

旧解决方案:

如果你想找到给定的插槽已经被填满

st = 时间戳记中的给定开始时间 et = 时间戳记中的给定结束时间

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(已创建并存储在 db 中)
  • endTimeStamp = 5:00 AM(已创建并存储在数据库中)

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

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

如下所述:

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


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

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

所以我所做的是我首先签入,条件是 st 和 et 大于 startTimestamp,并且 endtime 大于 st 和 et, 然后在另一个条件下检查两个时间是否小于 startTime 和 Endtime,

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多