2009-03-02 9 views
1

Ich habe ein Zeitfeld in einer MSSQL 2008-Datenbank, die ich etwas zu den Auswirkungen von tun:Linq zu SQL, Summierungszeit?

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

Wo AmountOfTime ist eine Zeit MSSQL Feld. Summe scheint nur bei Dezimalzahlen zu funktionieren. Wie kann ich diese Spalten hinzufügen?

Antwort

0

Wahrscheinlich möchten Sie die Perioden in Intervalle konvertieren - wenn nötig, indem Sie die Startzeit von der Endzeit subtrahieren. Beachten Sie, dass der Typ TIME einen Zeitpunkt und keine Dauer darstellt. In Standard-SQL möchten Sie INTERVAL HOUR TO SECOND. Ich bin mir nicht sicher, ob Microsoft das unterstützt - es gibt andere große DBMS, die das nicht tun. Wenn Sie mit TIME nicht weiterkommen, sollten Sie in der Lage sein, TIME '00: 00: 00 'von den Werten zu subtrahieren und etwas praktikabler zu bekommen (das wäre ein INTERVAL).

Ein besonderer Vorteil der Intervalle ist, dass Sie sie tatsächlich über SUM addieren können.

Für die Details können Sie manuell bei MSDN (oder über Google) bash, wie ich kann.

0

Wenn SQL Construct dies nicht unterstützt, können Sie nicht ... Warum erstellen Sie nicht ein spezielles Feld, das eine numerische Darstellung der Zeit hat, und dann können Sie es zusammen mit SQL hinzufügen.

-1

Ich löste dies die folgende Methode verwenden, da Sie ein Start- und endet auf dem Tisch haben:

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

Dann können Sie es verwenden, um die Gesamtzahl der Stunden zu erhalten:

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

Es funktioniert, aber das Problem damit ist, dass Sie alle gefundenen Einträge aus der Datenbank anfordern, um die Summe zu berechnen. Abhängig von der Tabellengröße ist dies möglicherweise nicht effizient genug. –

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

funktioniert nicht serverseitig – usr