Pregunta

Tengo un campo de tiempo en una base de datos mssql 2008 en el que quiero hacer algo para el efecto de:

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

Donde AmountOfTime es un campo MSSQL de tiempo. La suma parece funcionar solo en decimales, ¿cómo puedo agregar estas columnas?

¿Fue útil?

Solución

Es probable que desee convertir los períodos a intervalos; si es necesario, reste la hora de inicio de la hora de finalización. Tenga en cuenta que el tipo HORA representa un instante, no una duración. En SQL estándar, desea INTERVAL HOUR TO SECOND. No estoy seguro de si Microsoft lo admite; hay otros DBMS importantes que no lo hacen. Si está atascado con TIME, debería poder restar TIME '00: 00: 00 'de los valores y obtener algo viable (que sería un INTERVALO).

Una ventaja particular de los intervalos es que, de hecho, puedes sumarlos a través de SUMA.

Para obtener más información, puede hacer un bash manual en MSDN (o a través de Google) lo mejor que yo.

Otros consejos

Si la construcción SQL no admite esto, no puede ... ¿Por qué no crea un campo especial que tenga una representación numérica de la hora y luego puede agregarlo usando 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);

Resolví esto usando el siguiente método, dado que tienes una fecha y hora de inicio y finalización en tu tabla:

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

Luego puedes usarlo para obtener el número total de horas:

double foo = AmountOfTime(datacontext.Where(conditions)).TotalHours;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top