Domanda

Ho un campo orario in un database mssql 2008 che voglio fare qualcosa per l'effetto di:

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

Dove AmountOfTime è un campo MSSQL temporale. Somma sembra funzionare solo su decimali, come posso aggiungere queste colonne?

È stato utile?

Soluzione

Probabilmente vuoi convertire i periodi in intervalli - se necessario, sottraendo l'ora di inizio dall'ora di fine. Si noti che il tipo TIME rappresenta un istante, non una durata. In SQL standard, si desidera INTERVAL HOUR TO SECOND. Non sono sicuro che Microsoft lo supporti - ci sono altri DBMS importanti che non lo supportano. Se sei bloccato con TIME, dovresti essere in grado di sottrarre TIME '00: 00: 00 'dai valori e ottenere qualcosa di fattibile (che sarebbe un INTERVALLO).

Un vantaggio particolare degli intervalli è che puoi effettivamente sommarli tramite SUM.

Per i dettagli, puoi bash manuale su MSDN (o tramite Google) come posso.

Altri suggerimenti

Se il costrutto SQL non lo supporta, non è possibile ... Perché non creare un campo speciale con una rappresentazione numerica del tempo, quindi è possibile aggiungerlo insieme tramite SQL.

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);

Ho risolto questo problema usando il metodo seguente, dato che hai un inizio e un termine datetime sul tuo tavolo:

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

Quindi puoi usarlo per ottenere il numero totale di ore:

double foo = AmountOfTime(datacontext.Where(conditions)).TotalHours;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top