6

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

上記のレコードから平均時間を取得するために、linq to sql クエリを実行したいと考えています。私は次のことを試しました:

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

「SleepTo」は日時フィールドであるため、Average() でエラーが発生します。整数などの平均を取得しようとしていた場合、上記の linq クエリは機能します。

日時で機能させるにはどうすればよいですか?

4

3 に答える 3

11

内部的には、すべての DateTime は実際にはティック数として格納されます。DateTimeのTicksプロパティは、「0001 年 1 月 1 日の真夜中の 12:00:00 から経過した 100 ナノ秒間隔の数」として定義されます。( http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspxを参照)

DateTimes をティックに変換してから、平均してから datetime に戻すことができます。

var averageTicks = (long) dates.Select(d => d.Ticks).Average();
var averageDate = new DateTime(averageTicks);

データ構造とフォーマットを使用すると、次のようになります。

var averageTicks = (long)(from o in MYDATA select o.SleepTo.Ticks).Average();
var averageDate = new DateTime(averageTicks);

各 SleepTo 値の平均時間を取得したい場合 (Date コンポーネントを無視して)、時間だけの目盛りを取得できます。

var averageTicks = (long)(from o in MYDATA select o.SleepTo.TimeOfDay.Ticks).Average();
var averageTime = new TimeSpan(averageTicks);
于 2012-04-14T21:27:55.673 に答える
5

これに役立ついくつかの拡張メソッドを次に示します... リストに多数の DateTimes がある場合、ティック ( longvars) の LINQ 平均がオーバーフローするというコアの問題があります。

    public static long Average(this IEnumerable<long> longs)
    {
        long count = longs.Count();
        long mean = 0;
        foreach (var val in longs)
        {
            mean += val / count;
        }
        return mean;
    }

    public static DateTime Average(this IEnumerable<DateTime> dates)
    {
        return new DateTime(dates.Select(x => x.Ticks).Average());
    }
于 2013-04-03T15:33:08.750 に答える
1

データベース LINQ プロバイダーは、絶対日付で平均を計算する方法を理解していないようです。考えてみれば、どちらが理にかなっていますか (平均は合計をカウントで割った値です。合計とは何ですか?)。

そのため、次のコマンドを実行できない場合:

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

そうすれば、あなたもできなくなります.Average()

必要なのは実際には SleepToの平均時間であるため、日付の時間コンポーネントだけを TimeSpan (時間から真夜中を引いたもの) として取得し、それを平均する必要があります。ひょっとして持っていSleepFromますか?

それまでの間、次の記事が参考になるかもしれません: LINQ Average TimeSpan?

于 2012-04-13T23:24:42.533 に答える