首页 > 解决方案 > 以秒为单位查找日期范围重叠的长度

问题描述

假设我有一个包含特定事件的开始/结束时间的文档。使用 MongoDB 我想确定另一个开始/结束时间的重叠(以秒为单位)。

例如,我有以下现有文档:

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

然后给定我想将它与 start time2018-02-06 12:58:04.000和 end time进行比较2018-02-06 15:59:04.000。我希望我totalOverlapInSeconds60

有很多关于如何确定日期是否重叠的示例(如果与其他日期重叠,MongoDB 会查找日期范围)。但是你如何得到它们重叠的秒数呢?

标签: mongodbaggregation-framework

解决方案


要获得差异,您可以从两组中$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游乐场

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

在此处输入图像描述


推荐阅读