You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:08:28