Pergunta

Eu tenho um campo de tempo em um banco de dados MSSQL 2008, que eu quero fazer algo no sentido de:

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

Onde AmountOfTime é um campo MSSQL tempo. Soma parece funcionar apenas em decimais, como posso adicionar essas colunas?

Foi útil?

Solução

Você provavelmente vai querer converter os períodos de intervalos - se necessário, subtraindo a hora de início a partir do momento final. Note que o tipo TIME representa um instante, não uma duração. No padrão SQL, você quer INTERVALO HORA PARA SEGUNDA. Eu não tenho certeza se a Microsoft suporta isso - existem outros grandes DBMS que não. Se você está preso com o tempo, você deve ser capaz de subtrair TEMPO '00: 00: 00' a partir dos valores e obter viável algo (que seria um intervalo)

.

Uma vantagem particular de intervalos é que você pode realmente adicionar-las via SUM.

Para os detalhes, você pode bash manual em MSDN (ou via Google), assim como eu posso.

Outras dicas

Se construção SQL não suporta isso, você não pode ... Por que não fazer um campo especial que tem uma representação numérica do tempo, e então você pode adicioná-lo em conjunto, utilizando 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);

Eu resolvi isso usando o método a seguir, uma vez que você tem um início e data e hora de chegada em sua tabela:

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

Em seguida, você pode usá-lo para obter o número total de horas:

double foo = AmountOfTime(datacontext.Where(conditions)).TotalHours;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top