MongoDB 4.4:如何比较日期与另一日期的1年间隔?
解决MongoDB 4.4中日期差小于1年的判断问题
你原来用固定毫秒数(365*24*60*60000)计算加一年的方法不可靠,因为一年的天数并非固定——闰年有366天,不同月份的天数也有差异,直接加毫秒会导致跨闰年、跨不同天数月份时计算出错。
MongoDB 4.4虽没有$dateAdd,但可以用$dateFromParts精准构造scheduled_start加一年后的日期,核心思路是拆解原日期的年、月、日,年份加1后重新组合,同时处理闰年2月29日的特殊情况(比如2020-02-29加一年应为2021-02-28)。
具体实现表达式
scheduled_end: { $lt: { $dateFromParts: { year: { $add: [{ $year: "$scheduled_start" }, 1] }, month: { $month: "$scheduled_start" }, day: { $cond: [ // 判断是否是闰年的2月29日 { $and: [ { $eq: [{ $month: "$scheduled_start" }, 2] }, { $eq: [{ $dayOfMonth: "$scheduled_start" }, 29] }, // 检查加1年后是否为闰年,非闰年则用28天 { $not: [{ $mod: [{ $add: [{ $year: "$scheduled_start" }, 1] }, 4] }] } ] }, 28, { $dayOfMonth: "$scheduled_start" } ] } } } }
逻辑说明
- 用
$year、$month、$dayOfMonth分别提取scheduled_start的年、月、日 - 年份直接加1,月份保持不变
- 通过
$cond判断原日期是否为闰年2月29日:若加1年后非闰年,就把日期设为28日,否则保留29日 - 最后用
$dateFromParts组合成加一年后的日期,再和scheduled_end比较大小
这种方式能精准判断scheduled_end是否小于scheduled_start加一年的日期,避免了固定毫秒数带来的误差。
内容的提问来源于stack exchange,提问作者rcs
相关产品推荐
相关产品推荐

