繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM