linq比较两个日期之间的列数据

时间:2012-10-30 16:51:41

标签: c# linq linq-to-objects

我需要比较上周和两周前用户的得分。

我有一张这样的桌子 分数

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 in Scores,其中s.scoredate> = startOneWeekAgo&& s.scoredate<   endOneWeekAgo

这导致了。这是我到目前为止所做的。帮助将不胜感激。

user score subject
2     10    math
2     5     science

1 个答案:

答案 0 :(得分:1)

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;
    }
}

还有一件事 - 尽量避免一次声明几个变量。