如何按时间分组?我要做的是获取总分钟数,并从分钟函数执行获取时间跨度。
最终,我试图在一个月内获得在特定帐户上花费的平均时间。 我也在试图找到在特定帐户上花费的总时间。
我觉得我很接近,但我在select语句中尝试的所有内容似乎都不起作用。
period = new DateTime(2013,1,1);
endPeriod = new DateTime(2013,1,1).AddMonths(1).AddDays(-1);
account.AccountNumber = 1455;
var q = from logs in db.logs
where logs.AccountNumber == account.AccountNumber
where logs.StartDateTime > period && logs.StartDateTime < endPeriod
let time = new TimeSpan(logs.ElapsedHours, logs.ElapsedMinutes, 0).TotalMinutes
group logs by time into g
select new {
AvgTime = g.Average(g.Key)
}
此查询当前返回5行。它应该只返回1.我不确定我做错了什么。
有什么建议吗?
麦克
答案 0 :(得分:0)
您的查询有点令人困惑 - 您按值(时间跨度)进行分组,但显然是尝试计算键值的平均值,而不是每组中项目的平均值。如果确实如此,请尝试:
period = new DateTime(2013,1,1);
endPeriod = new DateTime(2013,1,1).AddMonths(1).AddDays(-1);
account.AccountNumber = 1455;
var q = from logs in db.logs
where logs.AccountNumber == account.AccountNumber
&& logs.StartDateTime > period && logs.StartDateTime < endPeriod
let time = new TimeSpan(logs.ElapsedHours, logs.ElapsedMinutes, 0).TotalMinutes
group logs by time into g
select new {
Time = g.Key
}
var averageTime = q.Average(i => i.Time);
g.Key
只会为每个组提供一个值,这就是为什么你会看到5条记录(我假设你的数据会产生5组)。
答案 1 :(得分:0)
这就是我最终的结果:
var result = (from logs in db.logs
where logs.AccountNumber == 1450
where logs.StartDateTime > new DateTime(2013,1,1) && logs.StartDateTime < new DateTime(2013,1,31)
group logs by logs.AccountNumber into g
select new {
AvgTime = (g.Sum(h=>h.ElapsedHours) * 60) + g.Sum(h=>h.ElapsedMinutes) / g.Count(),
TotalTime = (g.Sum(h=>h.ElapsedHours) * 60) + g.Sum(h=>h.ElapsedMinutes)
}).ToList()
.Select(x=> new {
AvgTime = TimeSpan.FromMinutes(x.AvgTime),
TotalTime = TimeSpan.FromMinutes(x.TotalTime)
});