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

如何获取ASP.NET MVC数据表中指定月份无记录的日期?

获取指定月份无记录日期的解决方案

要得到目标月份内无考勤记录的日期,核心思路是先生成该月份的完整日期列表,再排除已有记录的日期,具体步骤如下:

1. 生成目标月份的所有日期

首先创建一个包含该月份每一天的日期集合,只保留日期部分(忽略时间):

// 生成从startDate到endDate的所有日期(仅日期部分)
var allDatesInMonth = Enumerable.Range(0, (endDate - startDate).Days + 1)
    .Select(dayOffset => startDate.AddDays(dayOffset).Date)
    .ToList();

2. 获取已有记录的日期

直接从数据库提取该员工在目标月份内有记录的日期(比从查询结果里解析字符串更高效且避免格式问题):

var existingDates = db.UserLog
    .Where(l => l.Emp_Id == EmpId && l.Login_Date >= startDate && l.Login_Date <= endDate)
    .Select(l => l.Login_Date.Date) // 只取日期部分
    .Distinct() // 去重,避免同一日期多条记录的影响
    .ToList();

3. 计算无记录的日期

用完整日期列表减去已有记录的日期集合,得到的就是无考勤记录的日期:

var missingDates = allDatesInMonth.Except(existingDates).ToList();

整合到现有代码的完整示例

把上述逻辑加入你的控制器代码中,最终代码如下:

var startDate = new DateTime(attendanceVM.MonthYear.Year, attendanceVM.MonthYear.Month, 1);
var endDate = startDate.AddMonths(1).AddDays(-1);
int EmpId = int.Parse(((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirst("UserId").Value);

// 1. 生成当月所有日期
var allDatesInMonth = Enumerable.Range(0, (endDate - startDate).Days + 1)
    .Select(dayOffset => startDate.AddDays(dayOffset).Date)
    .ToList();

// 2. 获取已有记录的日期
var existingDates = db.UserLog
    .Where(l => l.Emp_Id == EmpId && l.Login_Date >= startDate && l.Login_Date <= endDate)
    .Select(l => l.Login_Date.Date)
    .Distinct()
    .ToList();

// 3. 得到无记录的日期列表
var missingDates = allDatesInMonth.Except(existingDates).ToList();

// 原有查询逻辑不变
IEnumerable<AttendanceResults> results = (from l in db.UserLog 
                                         where l.Emp_Id == EmpId && l.Login_Date >= startDate && l.Login_Date <= endDate 
                                         select new AttendanceResults {
                                             Id = l.Id,
                                             Date = l.Login_Date.ToString(),
                                             Acc_Name = l.PC_User_Name,
                                             PC_Name = l.PC_Name
                                          }).ToList();

注意事项

  • 如果你的Login_Date字段包含时间信息,一定要使用.Date只保留日期部分,避免同一日期因时间不同被误判为不同日期。
  • 直接从数据库查询已有日期比从results集合解析字符串更高效,减少内存操作和格式解析错误的风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:31:21