Linq to sql,总结时间跨度?

时间:2009-03-02 07:40:13

标签: linq-to-sql sql-server-2008 datetime timespan

我在mssql 2008数据库中有一个时间字段,我想做一些有效的事情:

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

其中AmountOfTime是时间MSSQL字段。 Sum似乎只适用于小数,我该如何添加这些列?

4 个答案:

答案 0 :(得分:0)

如果SQL构造不支持这个,你就不能......为什么不创建一个具有时间数字表示的特殊字段,然后你可以使用SQL将它们组合在一起。

答案 1 :(得分:0)

您可能希望将期间转换为间隔 - 如有必要,可以从结束时间减去开始时间。请注意,TIME类型表示即时,而不是持续时间。在标准SQL中,您需要INTERVAL HOUR TO SECOND。我不确定微软是否支持这一点 - 还有其他主要的DBMS没有。如果您遇到TIME,您应该能够从值中减去TIME '00:00:00'并获得可行的东西(这将是一个INTERVAL)。

区间的一个特殊优势是你确实可以通过SUM添加它们。

有关详细信息,您可以在MSDN(或通过Google)手动压缩,也可以。

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

我使用以下方法解决了这个问题,因为你的桌子上有一个开始和结束的日期时间:

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;