Linq to sql, суммирование времени?
-
03-07-2019 - |
Вопрос
У меня есть поле времени в базе данных 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;