mongodb - 以秒为单位查找日期范围重叠的长度
问题描述
假设我有一个包含特定事件的开始/结束时间的文档。使用 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
。我希望我totalOverlapInSeconds
是60
。
有很多关于如何确定日期是否重叠的示例(如果与其他日期重叠,MongoDB 会查找日期范围)。但是你如何得到它们重叠的秒数呢?
解决方案
要获得差异,您可以从两组中$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 转换为秒。
下图说明了两组的所有可能情况。r表示将作为减法右侧的时间点,而l表示减法左侧:
推荐阅读
- javascript - 脚本共享联系人 API 后清除联系人缓存
- python - 从目录到 .csv 列的文件名(每行文件名;无间隙行)
- android - 如何在 Recyclerview 中显示服务器信息?
- powerapps - PowerApps 到模型驱动应用程序中的 SQL Server 数据库的连接可以是双向的吗?
- themes - Shopify 主题开发 | 为以前的订单创建“重新订购”链接 | 无法链接多个 ID:数量查询字符串
- c - 错误:函数“两次”的参数太少
- composer-php - 无法更新 Composer 的内存大小
- c - 异步 MPI_Irecv 的 MPI_Waital 错误
- react-native - 为什么我的按钮从屏幕上消失了?
- python-3.x - 2 参数 numpy where 函数