Найти длину в секундах, в течение которой диапазоны дат перекрываются - PullRequest
1 голос
/ 23 апреля 2019

Предположим, у меня есть документ, который имеет время начала / окончания определенного события.Используя MongoDB, я хочу определить перекрытие (в секундах) с учетом другого времени начала / окончания.

Например, у меня есть следующий существующий документ:

startTime:2018-02-06 12:36:33.000
endTime: 2018-02-06 12:59:04.000

Затем я хочу сравнить еговремя начала 2018-02-06 12:58:04.000 и время окончания 2018-02-06 15:59:04.000.Я ожидаю, что мои totalOverlapInSeconds будут 60.

. Существует много примеров того, как определить, перекрываются ли даты ( MongoDB находит диапазон дат, если перекрываются с другими датами ).Но как вы получаете секунды, в которых они перекрываются?

1 Ответ

2 голосов
/ 23 апреля 2019

Чтобы получить разницу, вы можете $ вычесть $ min end значений и $ max start значений из обоих наборов. Если два набора не перекрывают друг друга, вы получите отрицательное значение, поэтому вы можете использовать $ max еще раз для назначения 0 в таком случае. Попробуйте:

let startTimeParam = ISODate("2018-02-06 12:58:04.000");
let endTimeParam = ISODate("2018-02-06 15:59:04.000");

db.col.aggregate([
    {
        $project: {
            seconds: {
                $let: {
                    vars: {
                        totalMs: {
                            $max: [
                                0,
                                { $subtract: [ { "$min": [ "$endTime", endTimeParam ] }, { $max: [ "$startTime", startTimeParam ] } ] }
                            ]
                        }
                    },
                    in: {
                        $divide: [ "$$totalMs", 1000 ]
                    }
                }
            }
        }
    }
])

Использование $ let для определения временной переменной и $ Деление для преобразования мс в секунды.

MongoDB детская площадка

Ниже диаграмма иллюстрирует все возможные случаи на двух наборах. r представляет момент времени, который будет взят как правая сторона вычитания, в то время как l представляет левую сторону вычитания:

enter image description here

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