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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:15:33