从数据表中获取按日期和每两小时分组的记录

时间:2018-08-31 13:20:08

标签: c# linq

我有一个数据表,其列为名称,代码,dateAndTime。现在,我想使用LINQ来获取一天中每小时的所有记录数。

DateTime列包含的数据为

2018-08-01 07:00:06.163
2018-08-01 07:50:11.873
2018-08-01 08:00:42.623
2018-08-01 07:20:48.363
2018-08-01 09:01:15.243
2018-08-01 06:01:16.507

现在我想获取从一天开始到一天结束时每小时所有记录的计数。

示例为:
如果第一条记录是在2018-08-01上午5点左右,那么第一行的记录是从凌晨5点到上午7点

2018-08-01  7   ( 5 Am - 7 Am) - 36 count
2018-08-01  9   ( 7 Am - 9 Am) - 12 count
2018-08-01  11   ( 9 Am - 11 Am) - 12 count
2018-08-01  13  (11 Am - 1 PM)- 0 count
2018-08-01  15  (1 PM - 3 PM)- 36 count

1 个答案:

答案 0 :(得分:1)

您可以尝试以下代码:

const int groupHours = 2;
const int driftHours = 1;
var dateTimes = new List<DateTime>() { new DateTime(2018, 8, 30, 7, 0, 6), new DateTime(2018, 8, 30, 8, 0, 6) };
var result = dateTimes.GroupBy(d => new DateTime(d.Year, d.Month, d.Day, (((d.Hour - driftHours) / groupHours) + 1) * groupHours + driftHours, 0, 0)).Select(g => new { Key = g.Key, Count = g.Count() });

(((d.Hour - driftHours) / groupHours) + 1) * groupHours + driftHours上午8点的示例:

  • 从8 AM = 7 AM减去1(从常规数除以2所得的小时数中减去)
  • 除以2(组中的小时跨度),并截断小数点后的所有内容-到目前为止,有多少个“组”
  • 将1添加到先前的结果中,以获取当前组
  • 乘以2(组中的小时跨度)以获得该组的小时数
  • 加1(漂移),使8分中的9分占10等中的11个
相关问题