[英]linq compare column data between two dates
我需要比较上周和两周前的用户得分。
我有一张像这样的桌子
user score subject date
2 10 math 21/10/2012
2 5 science 23/10/2012
2 5 math 16/10/2012
2 9 science 15/12/2012
我需要生成一个查询,该查询显示上周的分数以及它是比2周前的分数增加还是减少
user score subject date increase/decrease
2 10 math 21/10/2012 +5
2 10 science 23/10/2012 -4
日期列不需要包含在查询中。我已经有了获取上周至两周前的周范围的代码。 我在比较两个日期时遇到了麻烦。
DateTime date = DateTime.Now;
DateTime startOneWeekAgo = date.AddDays(-7).Date.AddDays(-(int)date.DayOfWeek),
endOneWeekAgo = startOneWeekAgo.AddDays(7);
DateTime startTwoWeeksAgo = startOneWeekAgo.AddDays(-7),
endTwoWeeksAgo = endOneWeekAgo.AddDays(-7);
从s中的分数开始,其中s.scoredate> = startOneWeekAgo && s.scoredate <endOneWeekAgo
这就是结果。这就是我到目前为止所拥有的。 帮助将不胜感激。
user score subject
2 10 math
2 5 science
DateTime beginningOfWeek = DateTime.Now.BeginningOfWeek();
DateTime twoWeeksAgo = beginningOfWeek.AddDays(-14);
DateTime endOfLastWeek = beginningOfWeek.AddMilliseconds(-1);
var query = from s in scores
where s.Date >= twoWeeksAgo && s.Date <= endOfLastWeek
orderby s.Date
group s by new { s.User, s.Subject } into g
select new
{
User = g.Key.User,
Subject = g.Key.Subject,
Date = g.Last().Date,
Diff = g.Last().Score - g.First().Score
};
因此,您总是只选择两个最后的分数(两个星期前和一个星期前),每个组中只有两个记录。
如果数据库中只有一个星期的结果,则差异将为零,因为组中的最后一个条目将是相同的。
另外,您可以使用一些DateTime
扩展名来获取一周的开始时间:
public static class DateExtensions
{
public static DateTime BeginningOfWeek(this DateTime date,
DayOfWeek firstDayOfWeek = DayOfWeek.Monday)
{
if (date.DayOfWeek == firstDayOfWeek)
return date.Date;
DateTime result = date.AddDays(-1);
while (result.DayOfWeek != firstDayOfWeek)
result = result.AddDays(-1);
return result.Date;
}
}
还有一件事-尝试避免一次声明多个变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.