Как проверить, что две временные метки частично находятся между данными двумя временными метками в Python? - PullRequest
0 голосов
/ 11 октября 2019

заданное начальное время равно 3: 00 AM заданное конечное время равно 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},

в запросе монго, чтобы найти проверку существующих слотов. если запрос дает результат, то я не вставляю слот и отвечаю, что слот недоступен.

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

обновление :

новое решение : идеальное решение Логика: (Макс (StartA, StartB) <= Мин (EndA, EndB) </p>

старое решение:

, если вы хотите найти, что данный слот уже заполнен

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:00 (уже создано и сохранено в дБ)

  • GivenStartTimeStamp ( st ) = 2:00 AM (мы хотим сохранить в дБ)

  • GivenEndTimeStamp ( et ) = 4:00 AM (мы хотим сохранить в дБ)

, которые описаны ниже:

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


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

поэтому он не должен вставлять в БД, потому что, если он вставляет сейчас, то когда мы выбираем, он дает несколько данных за некоторый период времени.

так что я сделал, я проверил в первую очередь и условие, что st и etбольше, чем startTimestamp, а также endtime больше, чем st и et, затем в другом и проверяется условие, если оба времени меньше startTime и Endtime,

, поэтому, если данные плохи, чем целое условие становится ложным, в противном случае любое одно условие становится True.

[Примечание: он решает все четыре условия.]

обновление : (более короткое решение)

(Max(StartA, StartB) <= Min(EndA, EndB)
0 голосов
/ 11 октября 2019

В основном вы хотите проверить, есть ли какие-либо конфликты для данного временного диапазона. У вас есть референсный диапазон (от 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

В строке 3если условие, первое проверяет, находится ли начало в пределах контрольного диапазона, второе, если конец находится в пределах контрольного диапазона, и третье, если начало диапазона находится в заданном случае.

Я незнать, как это переводится в запрос MongoDB. Я считаю, что есть библиотеки Python, которые решают проблему с более элегантным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...