如何使用LINQ在C#中按特定的时间戳间隔进行分组?

时间:2009-03-04 16:46:17

标签: c# linq datetime group-by intervals

我有一个包含tick对象的列表,包括一对double值和一个时间戳。

我希望根据时间间隔(例如15分钟)将列表分成子列表。一个列表只有来自的对象:8:00:00 - 8:14-59 usw usw

C#-code:

var result = from tick in listTicks
group tick by tick.timestamp.Hour; 

datetime函数如日,小时,分钟工作正常,但我无法获得特定的间隔。

对象是LINQ。我已经从数据库中获取了列表,我想要转换列表。

如果我将每天8-22的数据分开到3小时,他会这样分开:

  

0-2; 3-5; 6-8; 9-11

使用代码:

var result = from tick in listTicks group tick by
(tick.timestamp.Day * 10 + tick.timestamp.Hour / 3);

我想:

  

8-10; 11-13; 14-16; 17-19; 20-22

我希望它以这种方式分开。

2 个答案:

答案 0 :(得分:2)

var result = from tick in listTicks
group tick by (tick.timestamp - DateTime.MinValue).TotalMinutes / 15 into f
from c in f
select new { StartTime = DateTime.MinValue + TimeSpan.FromMinutes(c.Key),
             Items = ... };

修正:DateTime.Now会导致问题:)

错误提示:不使用LINQ2SQL

修复:留给读者:)

答案 1 :(得分:0)

在SQL数据库中创建一个计算列,将此表达式设置为日期,并使其返回该日期所代表的秒数。

然后您可以按分割值进行分组,它应该可以正常工作。如果你除以15 * 60,你将得到15分钟的小组。

编辑:

var result = from tick in listTicks 
             group tick by tick.timestamp / (3 * 3600);

为了使上述工作,时间戳应该是自某个纪元以来的秒数,如果你使用SQL服务器,这将是SqlDateTime.MinValue。