查找日期范围重叠的长度(以秒为单位)

时间:2019-04-23 20:04:29

标签: mongodb aggregation-framework

假设我有一个文档,其中包含特定事件的开始/结束时间。我想使用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进行比较。我希望我的totalOverlapInSeconds60

有许多示例说明如何确定日期是否重叠(MongoDB find date range if overlap with other dates)。但是,如何获得它们重叠的秒数?

1 个答案:

答案 0 :(得分:2)

要获得差异,您可以从两个集合中选择$subtract $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定义临时变量,使用$divide将ms转​​换为秒。

MongoDB playground

下图说明了两组的所有可能情况。 r 表示将作为减法右侧的时间点,而 l 表示减法的左侧:

enter image description here