2013-07-25 109 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。 –