0

datatable で従業員の出席の詳細を取得しています。このように見えます

Day       SwipeTime
12/31/2012  11AM
12/31/2012  1PM
12/31/2012  7PM
12/31/2012  8PM
1/1/2012    2PM
1/1/2012    7PM
1/1/2012    8PM
1/2/2012    10AM
1/2/2012    8PM

totalhours = lastswipe - firstwipe である従業員の日付と totalhours を表示する必要があります

私の結果は次のようになります

Day TotalHours
12/31/2012  9
1/1/2012    6
1/2/2012    12

したがって、日付ごとにグループ化された最小および最大のスワイプを見つける必要があります。クエリを書くのを手伝ってください

4

2 に答える 2

3

を使用Enumerable.GroupByしてグループ化できますdateDictionary<DateTime,int>次に、キーが日付で、値がその日付の合計時間である を作成できます。

Dictionary<DateTime,int> dateGroups = table.AsEnumerable()
    .GroupBy(r => r.Field<DateTime>("Date").Date)
    .Select(g => new{
        Date = g.Key, 
        TotalHours = g.Sum(r => 
               DateTime.ParseExact(r.Field<string>("SwipeTime"), 
                      "htt", CultureInfo.InvariantCulture).Hour)
    }).ToDictionary(x => x.Date, x => x.TotalHours);

編集:それで、それはTotalHours一日中だったので、今は望ましい最大最小計算です。また、目的のタイムスパン形式を「11:41 AM」に変更しました。次にDateTime.Parse(str).TimeOfDay、タイムスパンを取得するために使用します。

Dictionary<DateTime, int> dateGroups = table.AsEnumerable()
.GroupBy(r => r.Field<DateTime>("Date").Date)
.Select(g => new
{
    Date = g.Key,
    TotalHours = 
       (g.Max(r => DateTime.Parse(r.Field<string>("SwipeTime")).TimeOfDay)
      - g.Min(r => DateTime.Parse(r.Field<string>("SwipeTime")).TimeOfDay)).Hours
}).ToDictionary(x => x.Date, x => x.TotalHours);
于 2013-01-09T07:59:22.307 に答える
2

この回答では、すべての行を2回解析し、解析された値から2つのセットを作成して最大アイテムと最小アイテムを取得するという2つのことを回避するために、1日の時間の順序付きリストが作成されます。また、同じ日付は同じ文字列値を持つため、グループ化する前に日を解析しません。

var query = from row in table.AsEnumerable()
            group row by row.Field<string>("Day") into g
            let times = g.Select(r => DateTime.Parse(r.Field<string>("SwipeTime")))
                         .OrderBy(t => t.TimeOfDay)
                         .ToList()
            select new
            {
                DateTime.Parse(g.Key).Date,
                (times.Last() - times.First()).TotalHours
            };

結果は、2 つのプロパティDateTime Datedouble TotalHours

于 2013-01-09T08:25:36.487 に答える