0

先週と 2 週間前のユーザーのスコアを比較する必要があります。

私はそのようなテーブルを持っています

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

日付列をクエリに含める必要はありません。先週から 2 週間前までの週の範囲を取得するコードが既にあります。ただし、2つの日付を比較するのに問題があります。

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.scoredate >= startOneWeekAgo && s.scoredate < endOneWeekAgo のスコアの s から

これは結果になります。これが私がこれまでに持っているものです。助けていただければ幸いです。

user score subject
2     10    math
2     5     science
4

1 に答える 1

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

したがって、常に最後の 2 つのスコア (2 週間前と 1 週間前) のみを選択すると、各グループには 2 つのレコードしかありません。

データベースに 1 週​​間の結果しかない場合、グループの最後と最初のエントリが同じになるため、差はゼロになります。

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

もう 1 つ、一度に複数の変数を宣言しないようにしてください。

于 2012-10-30T17:07:08.480 に答える