2009-03-02 8 views
1

私はの効果に何かをしたいMSSQL 2008データベースに時間フィールドを持っている:LINQ to SQL、加算タイムスパン?

AmountOfTimeは時間MSSQLフィールドです
Timespent = x.sum(x => x.AmountOfTime); 

。合計は小数点でのみ機能するようですが、どのようにこれらの列を追加できますか?

答えて

0

必要に応じて、終了時刻から開始時刻を差し引いて、期間を間隔に変換します。 TIMEタイプは瞬間を表し、持続時間を表していないことに注意してください。標準のSQLでは、INTERVAL HOUR TO SECONDが必要です。マイクロソフトがそれをサポートしているかどうかはわかりません。他の主要なDBMSはありません。あなたがTIMEで立ち往生している場合は、値からTIME '00:00:00 'を差し引いて、実行可能なもの(INTERVAL)を得ることができます。

インターバルの1つの利点は、あなたが本当にSUM経由でそれらを追加できることです。

詳細については、MSDN(またはGoogle経由)で手動bashを実行することもできます。

double foo = AmountOfTime(datacontext.Where(conditions)).TotalHours; 

public TimeSpan AmountOfTime(IQueryable<Something> iq) 
{ 
    TimeSpan ts = TimeSpan.Zero; 
    foreach (Something a in iq.ToList()) 
     ts += (a.finishdatetime - a.startdatetime); 
    return ts 
} 

は、その後、あなたが時間の合計数を取得するためにそれを使用することができます:

0

SQL構造体がこれをサポートしていない場合、時間の数値表現を持つ特殊なフィールドを作成して、それをSQLを使用して一緒に追加できますか?

-1

は、私はあなたのテーブルの上に、開始と終了日時を持っていることを考えると、以下の方法を使用して、これを解きます
+0

これは問題はありませんが、問題を解決するには、dbから検索されたすべてのエントリに合計を計算することが必要です。テーブルのサイズによっては、これは十分に効率的ではないかもしれません。 –

0
public static class Extentions 
{ 
    public static TimeSpan Sum<T>(this IEnumerable<T> items, Func<T, TimeSpan> selector) 
    { 
     var summ = TimeSpan.Zero; 
     foreach(T item in items) 
     { 
      summ += selector(item); 
     } 
     return summ; 
    } 
} 

var timespent = foo.Sum(f => f.finishdatetime - f.startdatetime); 
+0

はサーバー側で動作しません – usr