MongoDB中$subtract计算日期差为何为Long且与预期不符?如何解决?
问题解答
1. 为什么差值和你预期不符?
你误读了文档中的时间区间:start time是2016-01-01T00:00:45.000Z(凌晨0点0分45秒),stop time是2016-01-01T00:07:04.000Z(凌晨0点7分4秒),两者实际差值为6分19秒,换算成毫秒就是:(6*60 + 19)*1000 = 379000,和查询返回的结果完全一致。你之前误以为是6小时19分,是对时间的小时部分理解错误了。
2. 为什么返回值是Long("379000")?
MongoDB在聚合操作中使用$subtract计算日期差值时,会统一返回64位整数(Long类型)——这是为了避免当时间差超过32位整数最大值(约24天的毫秒数)时出现溢出问题。即使当前差值很小,也会用Long类型返回,属于正常行为,不影响后续数值计算。
3. 如何编写查询获取正确差值并转换为分钟/小时?
你的当前查询已经得到了正确的毫秒数。如果需要直接转换为分钟或小时,可以在$project中搭配$divide操作符完成单位转换:
转换为分钟(保留小数)
db.trips.aggregate([{ $project:{ "_id":0, "start time":1, "stop time":1, "trip duration(ms)": { $subtract: ["$stop time", "$start time"] }, "trip duration(min)": { $divide: [ { $subtract: ["$stop time", "$start time"] }, 60000 ] } } }])
转换为小时(四舍五入到两位小数)
db.trips.aggregate([{ $project:{ "_id":0, "start time":1, "stop time":1, "trip duration(hour)": { $round: [ { $divide: [ { $subtract: ["$stop time", "$start time"] }, 3600000 ] }, 2 ] } } }])
运行后会直接得到以分钟或小时为单位的行程时长,方便后续使用。
内容的提问来源于stack exchange,提问作者zynovij
相关产品推荐
相关产品推荐

