2009-03-02 20 views
1

Bir mssql 2008 veritabanında bir etki alanı oluşturmak istediğim bir etki alanı var:Linq sql, toplama zaman çizelgesi?

Timespent = x.sum(x => x.AmountOfTime); 

Burada AmountOfTime bir zaman MSSQL alanıdır. Toplam yalnızca ondalık basamaklarda çalışıyor gibi görünüyor, bu sütunları nasıl ekleyebilirim?

cevap

0

Muhtemelen periyotları aralıklara çevirmek istersiniz - gerekirse, bitiş zamanını bitiş zamanından çıkararak. TIME türünün bir süreyi değil bir süreyi temsil ettiğini unutmayın. Standart SQL'de INTERVAL HOUR TO SECOND. Microsoft'un bunu destekleyip desteklemediğinden emin değilim - olmayan diğer büyük DBM'ler var. Eğer TIME ile sıkışırsanız, TIME '00: 00: 00 'değerlerinden çıkarmanız ve işinize yarayan bir şey almanız gerekir (bu bir INTERVAL olacaktır).

Aralığın belirli bir avantajı, bunları gerçekten SUM aracılığıyla ekleyebileceğinizdir.

Ayrıntılar için, el ile yapabildiğim kadar MSDN'de (veya Google üzerinden) da bash yapabilirsiniz.

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 
} 

Sonra toplam saati almak için kullanabilirsiniz:

0

SQL yapısı bunu desteklemiyorsa, yapamazsınız ... Neden zamanın sayısal bir temsiline sahip olan özel bir alan yapmıyorsunuz ve SQL kullanarak birlikte ekleyebilirsiniz.

-1

ben size masada bir başlangıç ​​ve bitiş datetime sahip olduğu göz önüne alındığında, aşağıdaki yöntemi kullanarak bu çözüldü
+0

Çalışıyor, ancak bununla ilgili sorun, db'nin hesaplanan tüm girdileri toplamı hesaplamanızı istiyor olmanızdır. Tablo boyutuna bağlı olarak, bu yeterince verimli olmayabilir. –

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

sunucu tarafı çalışmıyor – usr