如何使用LINQ查询平均DateTime字段?

Jad*_*ade 5 c# linq linq-to-sql

我有一个数据库,在DateTime字段中有以下记录:

2012-04-13 08:31:00.000
2012-04-12 07:53:00.000
2012-04-11 07:59:00.000
2012-04-10 08:16:00.000
2012-04-09 15:11:00.000
2012-04-08 08:28:00.000
2012-04-06 08:26:00.000
Run Code Online (Sandbox Code Playgroud)

我想运行linq to sql查询以从上面的记录中获取平均时间.我尝试了以下方法:

(From o In MYDATA Select o.SleepTo).Average()
Run Code Online (Sandbox Code Playgroud)

由于"SleepTo"是一个日期时间字段,我在Average()上得到一个错误.如果我试图得到一个整数的平均值,上面的linq查询工作.

我需要做些什么才能让它在日期时间内工作?

Dua*_*iot 8

在内部,每个DateTime实际上都存储为多个刻度.TicksDateTime 的属性定义为"自0001年1月1日午夜12:00:00起经过的100纳秒间隔的数量".(参见http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx)

您可以将DateTimes转换为刻度,然后平均,然后转换回日期时间.

var averageTicks = (long) dates.Select(d => d.Ticks).Average();
var averageDate = new DateTime(averageTicks);
Run Code Online (Sandbox Code Playgroud)

使用您的数据结构和格式,它看起来像这样:

var averageTicks = (long)(from o in MYDATA select o.SleepTo.Ticks).Average();
var averageDate = new DateTime(averageTicks);
Run Code Online (Sandbox Code Playgroud)

如果您想获得每个SleepTo值的平均时间(忽略Date组件),您可以获得恰好时间的滴答:

var averageTicks = (long)(from o in MYDATA select o.SleepTo.TimeOfDay.Ticks).Average();
var averageTime = new TimeSpan(averageTicks);
Run Code Online (Sandbox Code Playgroud)

  • 有很多`Ticks`似乎`.Average(...)`抛出溢出异常.我假设它试图总结所有长值?(看似双倍) (7认同)

yam*_*men 1

数据库 LINQ 提供程序似乎不了解如何对绝对日期求平均值。如果你仔细想想,这是有道理的(平均值是总和除以计数 - 总和是多少?)。

因此,如果您无法运行以下命令:

(From o In MYDATA Select o.SleepTo).Sum()

那么你也将无法做到.Average()

由于您想要的实际上是 SleepTo 的平均时间,因此您只需将日期的时间部分作为 TimeSpan 获取(时间可能减去午夜)并求平均值。你有机会吗SleepFrom

与此同时,您可能会发现这篇文章很有启发:LINQ Average TimeSpan?