【问题标题】:Find length in seconds that date ranges overlap以秒为单位查找日期范围重叠的长度
【发布时间】:2019-04-24 04:49:25
【问题描述】:

假设我有一个包含特定事件的开始/结束时间的文档。使用 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)。但是您如何获得它们重叠的秒数?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    要获得差异,您可以使用两个集合中的 $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 将毫秒转换为秒。

    MongoDB playground

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

    【讨论】: