Linq group by DateTime / interval

时间:2010-02-08 22:29:45

标签: c# linq

我有以下查询

 var x = from t in v
                    group t by t.Time.Year + "-" t.Time.Month + "-" + 
                      t.Time.Day + " " t.Time.Hour + ":" + t.Time.Minute into g
                    select new { Tag = g.Key, Frequency = g.Count() };

t.Time是一个DateTime。以上闻起来有点i.m.o.有没有干净的方式 根据DateTimes按间隔分组?

编辑:我不太喜欢这个是字符串摆弄和生成字符串。理想情况下,我想从组中生成一个DateTime,而不是字符串。

5 个答案:

答案 0 :(得分:10)

似乎我真正想要的是

group t by
 new DateTime(t.Time.Year,t.Time.Month,t.Time.Day ,t.Time.Hour,t.Time.Minute,0) 
into g

即使我也将毫秒设置为+,也没有涉及添加/减去的建议对我有效。

dateTime.ToString(“yyyy-MM-dd HH:mm”)是strinc连接的一个很好的替代方法,如果我需要一个字符串。

答案 1 :(得分:1)

类似

group t by t.AddSeconds(60- t.Time.Seconds) // rounds to nearest minute

答案 2 :(得分:0)

这个怎么样:

DateTime[] v = new DateTime[]
{
    new DateTime(2010, 01, 01, 01, 01, 00, 100),
    new DateTime(2010, 01, 01, 01, 01, 30, 200),
    new DateTime(2010, 01, 01, 02, 01, 00, 300),
    new DateTime(2010, 01, 01, 03, 01, 45, 400)
};

var x = from t in v
        //group t by t.ToString("yyyy-MM-dd HH:mm") into g
        group t by t.AddSeconds(-t.TimeOfDay.TotalSeconds % 60) into g
        select new { Tag = g.Key, Frequency = g.Count() };

编辑:根据@Colin建议更改为.AddSeconds

答案 3 :(得分:0)

一分钟内有600,000,000个刻度,所以你可以做这样的事情,以便按最近的分钟分组:

var x = from t in v
        group t by new DateTime(t.Time.Ticks - (t.Time.Ticks % 600000000)) into g
        select new { Tag = g.Key, Frequency = g.Count() };

答案 4 :(得分:0)

var x = from t in v
group t by t.Time.Date.AddMinutes((Int32)t.Time.TimeOfDay.TotalMinutes) into g
   select new { Tag = g.Key, Frequency = g.Count() };