如何获取含日期与计数的一周全量数据(含零计数日期)
解决一周统计数据缺失零值日期的问题
核心思路
先生成目标时间段内的完整日期列表,再将该列表与现有统计数据做左连接,确保无数据的日期也能以userCount=0的形式返回。
具体实现
1. 生成一周完整日期范围
先创建包含过去7天所有日期的集合:
// dt为一周的起始日期,生成从dt到dt+6天的所有日期 var dateRange = Enumerable.Range(0, 7) .Select(i => dt.Date.AddDays(i)) .ToList();
2. 获取原有统计数据(保留原查询逻辑)
先执行你原有的查询,获取有数据的日期统计:
var existingStats = dbContext.MtMUsers.Join(dbContext.MtLogRegistrationAudits, U => U.EmployeeId, Ru => Ru.UserId, (U, Ru) => new { U = U, Ru = Ru }) .Where(x => x.Ru.Status != null && x.Ru.Status.ToLower() == "success" && x.Ru.LoggedDate.Value.Date >= dt.Date && x.Ru.LoggedDate.Value.Date <= dt.AddDays(6).Date && x.U.IsMobileUser != 0 && (request.clientIds == null || request.clientIds.Count == 0 || request.clientIds.Contains(x.U.ClientId)) && (request.assetIds == null || request.assetIds.Count == 0 || request.assetIds.Contains(x.U.AssetId)) && ((request.startDate == null && request.endDate == null) || (request.startDate <= x.U.CreatedDate && request.endDate >= x.U.CreatedDate))) .GroupBy(g => g.Ru.LoggedDate.Value.Date) .Select(s => new lastWeekStatisticsObject { date = s.Key, userCount = s.Count() }) .ToList();
3. 左连接合并数据
将完整日期列表与现有统计数据左连接,填充零值:
var lastWeekRegisterStatistic1 = dateRange .GroupJoin(existingStats, date => date, stat => stat.date.Date, // 确保按日期部分匹配,避免时间干扰 (date, matchingStats) => new lastWeekStatisticsObject { date = date, userCount = matchingStats.FirstOrDefault()?.userCount ?? 0 }) .OrderBy(o => o.date) .ToList();
效果说明
修改后返回的结果会包含一周7天的所有日期,无数据的日期userCount会被设为0,示例返回结构如下:
"lastWeekStatistics": [ { "date": "2022-11-07T00:00:00", "userCount": 0 }, { "date": "2022-11-08T00:00:00", "userCount": 0 }, { "date": "2022-11-09T00:00:00", "userCount": 0 }, { "date": "2022-11-10T00:00:00", "userCount": 166 }, { "date": "2022-11-11T00:00:00", "userCount": 132 }, { "date": "2022-11-12T00:00:00", "userCount": 17 }, { "date": "2022-11-13T00:00:00", "userCount": 0 } ]
内容的提问来源于stack exchange,提问作者MOHAMED YUSUF K
相关产品推荐
相关产品推荐

