Вопрос

У меня есть поле времени в базе данных mssql 2008, в котором я хочу что-то сделать:

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

Где AmountOfTime — поле MSSQL времени.Кажется, что сумма работает только с десятичными дробями. Как мне добавить эти столбцы?

Это было полезно?

Решение

Вероятно, вы захотите преобразовать периоды в интервалы — при необходимости вычитая время начала из времени окончания.Обратите внимание, что тип TIME представляет момент, а не продолжительность.В стандартном SQL вам нужен INTERVAL HOUR TO SECOND.Я не уверен, поддерживает ли это Microsoft — есть другие крупные СУБД, которые этого не поддерживают.Если вы застряли во ВРЕМЕНИ, вы сможете вычесть ВРЕМЯ '00:00:00' из значений и получить что-то работоспособное (это будет ИНТЕРВАЛ).

Одним из особых преимуществ интервалов является то, что их действительно можно складывать с помощью СУММ.

Для получения подробной информации вы можете вручную использовать bash в MSDN (или через Google), как и я.

Другие советы

Если конструкция SQL не поддерживает это, вы не сможете...Почему бы вам не создать специальное поле, в котором будет числовое представление времени, а затем вы сможете сложить его с помощью 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);

Я решил это, используя следующий метод, учитывая, что в вашей таблице есть дата и время начала и окончания:

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

Затем вы можете использовать его, чтобы получить общее количество часов:

double foo = AmountOfTime(datacontext.Where(conditions)).TotalHours;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top