$dateTrunc(日期截断)
最后更新:2026-10-09
$dateTrunc(日期截断)
$dateTrunc 将日期截断到指定时间单位的起点,返回截断后的新日期,适合按小时、天、月等粒度对齐时间戳做分组统计。unit 支持 year、quarter、month、week、day、hour、minute、second;binSize 可把单位放大成桶(如每 3 小时一个桶)。startOfWeek 仅对 week 生效,指定一周从哪天开始。timezone 决定截断所依据的时区日历,跨时区统计务必显式设置。本操作符在 MongoDB 5.0 引入。
| 分类 | 日期 |
|---|---|
| MongoDB 版本 | 5.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $dateTrunc: { date: <日期表达式>, unit: <时间单位>, binSize: <数值>, timezone: <时区>, startOfWeek: <周起始日> } }
⚙️ 参数
| date | 必填,要截断的日期。 |
|---|---|
| unit | 必填,截断单位:year、quarter、month、week、day、hour、minute、second。 |
| binSize | 可选,桶大小,放大单位粒度。 |
| timezone | 可选,截断依据的时区。 |
| startOfWeek | 可选,仅 unit 为 week 时生效。 |
返回值:截断后的新日期(BSON Date);date 为 null 或缺失时返回 null。
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $dateTrunc:按小时聚合销售额
db.sales.aggregate([
{ $group: {
_id: { $dateTrunc: { date: '$soldAt', unit: 'hour' } },
total: { $sum: '$amount' }
} }
])
运行结果:
{ "_id": ISODate("2026-09-25T08:00:00Z"), "total": 1250 }
{ "_id": ISODate("2026-09-25T09:00:00Z"), "total": 980 }
📌 注意事项
- 结果总是单位起点:unit 为 day 得到当天 00:00,unit 为 hour 得到整点
- binSize 支持 minute、hour、day、week、month、quarter、year
- quarter 单位把一年分成 4 段,结果取季度首日
🏷️ 相关标签
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Q和 $dateAdd 有什么区别?
A$dateTrunc 只把时间对齐到单位起点,不改变粒度;$dateAdd 是移动时间。
QbinSize 是什么意思?
A把单位放大成桶,如 binSize 为 3、unit 为 hour,即每 3 小时一个桶。
Q截断后是几点?
Aunit 为 day 时是当天 00:00,unit 为 hour 时是整点。