MongoDB聚合中如何将ticks格式时间转换为Date对象
MongoDB Ticks格式日期转Date对象解决方案
报错原因
你存储的ticks格式是以0001-01-01 00:00:00 UTC为起点、每单位为100纳秒的时间计数,而MongoDB的$toDate仅支持接收「Unix纪元(1970-01-01 00:00:00 UTC)为起点的毫秒/秒时间戳」。同时你使用的ticks数值超出了普通数值的安全解析范围,MongoDB会将其识别为字符串尝试解析,最终触发格式错误。
正确转换方案
转换逻辑固定为三步:
- 减去两个纪元的固定差值ticks:0001-01-01到1970-01-01的总ticks为固定值
621355968000000000 - 将差值除以10000:把100纳秒单位转换为毫秒单位
- 用
$toDate转换最终得到的毫秒时间戳
如果你的MyDateInTicks字段存储为数值/Long类型,直接使用以下$project语句即可:
$project: { ConvertedDate: { $toDate: { $divide: [ { $subtract: ["$MyDateInTicks", 621355968000000000] }, 10000 ] } } }
如果字段存储为字符串类型,需要额外增加一步类型转换:
$project: { ConvertedDate: { $toDate: { $divide: [ { $subtract: [ { $toLong: "$MyDateInTicks" }, 621355968000000000 ] }, 10000 ] } } }
内容的提问来源于stack exchange,提问作者user2516186
相关产品推荐
相关产品推荐

