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

使用Mongoose查询选中月份任意日期在起止日期区间的记录

使用Mongoose查询覆盖指定月份的区间记录

核心查询逻辑

要筛选出指定月份内任意日期落在记录的startDate与endDate区间的记录,本质是判断记录的时间区间和目标月份是否存在重叠。只需满足两个条件:

  • 记录的startDate ≤ 目标月份的最后一天
  • 记录的endDate ≥ 目标月份的第一天

代码实现(日期字段为Date类型)

假设你的Mongoose模型已将startDate和endDate定义为Date类型(推荐存储方式),查询代码如下:

// 定义目标月份(示例:2024年11月,JavaScript月份从0开始,所以10对应11月)
const targetYear = 2024;
const targetMonth = 10;

// 计算目标月份的起始和结束时间
const monthStart = new Date(targetYear, targetMonth, 1); // 当月第一天00:00:00
const monthEnd = new Date(targetYear, targetMonth + 1, 0, 23, 59, 59, 999); // 当月最后一天23:59:59.999

// 执行Mongoose查询
const matchingRecords = await YourModel.find({
  $and: [
    { startDate: { $lte: monthEnd } },
    { endDate: { $gte: monthStart } }
  ]
});

兼容字符串格式日期的查询

如果数据库中startDate和endDate以DD/MM/YYYY字符串存储,可通过$dateFromString转换后再比较:

const targetYear = 2024;
const targetMonth = 10;
const monthStart = new Date(targetYear, targetMonth, 1);
const monthEnd = new Date(targetYear, targetMonth + 1, 0, 23, 59, 59, 999);

const matchingRecords = await YourModel.find({
  $expr: {
    $and: [
      { 
        $lte: [ 
          { $dateFromString: { dateString: "$startDate", format: "%d/%m/%Y" } }, 
          monthEnd 
        ] 
      },
      { 
        $gte: [ 
          { $dateFromString: { dateString: "$endDate", format: "%d/%m/%Y" } }, 
          monthStart 
        ] 
      }
    ]
  }
});

示例验证

针对你提供的记录:

  • Test 1:区间2020-11-01至2028-11-01,包含2024年11月,会被筛选出来
  • Test 2:区间2018-07-22至2038-07-22,与2024年11月无重叠,不会被筛选
  • Test 3:区间2005-05-14至2035-05-14,包含2024年11月,会被筛选出来

内容的提问来源于stack exchange,提问作者Vimal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:50:43