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

如何在Node.js+Mongoose中按月查询考勤数据?

按指定月份筛选考勤数据的实现方案

要实现仅获取指定月份的考勤数据,你需要基于传入的getDate参数计算出目标月份的时间范围,再通过MongoDB的查询条件过滤数据,具体修改如下:

步骤说明

  • 解析时间参数:将传入的ISO格式字符串转换为Date对象,提取对应的年份和月份。
  • 计算时间范围:确定目标月份的起始时间(当月第一天的00:00:00)和结束时间(次月第一天的00:00:00),用$gte(大于等于)和$lt(小于)匹配该区间内的所有数据。
  • 添加查询条件:在Attendance.find()中加入时间范围过滤,确保只返回目标月份的记录。

修改后的代码

const getDate = req.query.month;
const targetDate = new Date(getDate);

// 计算目标月份的起始和结束时间
const startOfMonth = new Date(targetDate.getFullYear(), targetDate.getMonth(), 1);
const endOfMonth = new Date(targetDate.getFullYear(), targetDate.getMonth() + 1, 1);

// 按时间范围查询并关联用户信息
const datas = await Attendance.find({
  // 假设考勤表中存储时间的字段名为`date`,请根据实际字段名修改
  date: {
    $gte: startOfMonth,
    $lt: endOfMonth
  }
}).populate("user", "firstName lastName");

关键细节说明

  • 这里假设考勤集合中存储时间的字段是date,如果你的字段名不同(比如attendanceDate),需要替换成实际字段名。
  • 使用$lt匹配次月第一天而非当月最后一天,是为了避免处理不同月份天数不同的问题(比如2月、31天的月份),确保所有当月的时间都能被正确匹配。
  • 传入的getDate是ISO格式字符串,直接用new Date()即可正确解析,无需额外处理时区(MongoDB默认存储UTC时间,和传入的格式一致)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:40:17