2013-07-25 111 views
2

我有平均时间为sql

*startTime (datetime) 
*endTime  (datetime) 

列表和需要解决的平均时间在列表中的一切。

所以我猜我需要这样的东西

long averageTime = 
Convert.ToInt64(listOfStartEndTimes.Average(timeSpan => timeSpan.Ticks)) 

任何想法?

回答

4
long averageTime = listOfStartEndTimes 
         .Select(se => se.End - se.Start) 
         .Average(t => t.Ticks); 

或者,稍低的分辨率(Unix纪元日期代替):

long averageTime = listOfStartEndTimes 
         .Select(se => se.End - se.Start) 
         .Average(t => (t.Ticks – 621355968000000000)/10000000); 
+0

完美!然后简单地转换为小时分钟秒 – DreamToCode

+0

@DreamToCode其实我删除了那条评论,因为我认为我误解了你计算的平均值。你是计算每对开始/结束时间的平均值(所以你只添加两个TickCounts在一起,这将不会溢出),或者你想要所有时间的平均值(在这种情况下,你将*很可能得到一个溢出问题)? –

+0

这将是开始/结束时间的整个列表的平均值。 – DreamToCode

0

如果你有一个类

public class Time 
{ 
    public DateTime Start; 
    public DateTime Stop; 

    public Time(DateTime start, DateTime stop) 
    { 
     this.Start = start; 
     this.Stop = stop; 
    } 
} 

那你跟你也许可以datetime值填写得到平均值...

var avg = Times.Select(p => p.Stop - p.Start).Average(p => p.Seconds); 

在这里你可以替换p.Seconds,不管你想..小时,分钟等.. 注:没有测试,但我认为它可能工作

编辑:啊,已经回答了:)

+0

感谢您的贡献 – DreamToCode

+0

我认为你的意思是'.TotalSeconds',而不是'.Seconds'。 –

2

其他答案是正确的,你可以用简单的LINQ来平均TimeSpan属性。我更喜欢让TimeSpan类来确定精确度,例如Uffe所示。但请确保您使用的是正确的财产。 .Seconds将返回剩余的秒内不符合整分钟。您需要.TotalSeconds属性。

使用.Ticks可能很诱人,但如果您有很多值并且它们之间的距离足够远,则可以轻松获得OverflowException。我的建议是在结果中使用比你需要的单位小一个单位。所以如果你关心平均精度到一分钟,那么.TotalSeconds应该工作。如果您愿意,您可以将结果返回到TimeSpan

var sec = yourList.Select(p => p.Stop - p.Start).Average(p => p.TotalSeconds); 
var avg = TimeSpan.FromSeconds(sec); 

而且,由于你的StartStopDateTime类型,那么你真的需要注意自己的.Kind。像这样的操作只能保证准确,如果yourDateTime.Kind == DateTimeKind.Utc

如果它们是Local种类,那么结果将受运行代码的本地计算机的时区影响。如果它们是Unspecified,则该数据可能已经在本地时区或某个其他时区的上下文中被记录。如果您正在工作的时间覆盖夏令时转换,则您的减法结果可能不正确。

例如,如果运行在美国太平洋时区的代码,你有LocalDateTime,然后减去2013-11-03 06:00 - 2013-11-03 00:00会给你6的TimeSpan小时。但实际上,7个小时将会过去,因为这是DST结束的时间,并且时钟在1:00到2:00之间重复一小时。

要避免此问题,您应该只使用Utc中的DateTime值进行数学运算,或者应该使用DateTimeOffset值代替。

+0

是一个很好的答复谢谢你。本质上,我只需要几秒钟内的平均值,这将是一个内部应用程序,因此.kind将保持不变。 – DreamToCode

+1

仅仅因为它的内部应用程序并不能减轻对此类应用程序的需求。我的建议是使用DateTimeOffset。 –